why companies fail to hire good talent

December 27, 2014 at 6:56 pm | Posted in Programming | 1 Comment
Tags: , , , , ,

Recently Net Cloud Systems, Bangalore (INDIA) approached me for interview. They needed someone specialized in C and UNIX and since my last 5 years of industrial experience is full of C, Linux and UNIX, they must have thought I could be a good fit for the company. Gosh! how wrong they were.

I had to appear for an online test to get recruited. Unfortunately, I did not get any call from them after the test, so I got the point that I did not clear the test. That is fine by me, sometimes you win, sometimes you lose. As a computer programmer, as 24×7 coder, I have learned 2 things: 1st, it is always good to accept your own failures and move on with life by improving upon your skills. 2nd thing is the essence of this blogpost.

Net Cloud Systems had few questions as part of C programming test which actually did not belong to C language. IIRC, there were 2 or more questions not related to C language but they were put in the C test. I wrote an email to them, explained what was wrong and how could they correct the mistake and very politely I said it give would be fair if they could provide 2 marks for those questions. I got a very furious and arrogant reply in return. Down here is the full transcript of the conversation with them:

arnuld uttre 	Tue, Dec 23, 2014 at 7:18 PM
To: hr-necs@netcloudsystems.com
Dear Sirs,

Recently I gave online C test as a part of the selection process by
Net Cloud Systems. I did not get any call after that which means I did
not clear the test and company is not interested in hiring me but that
is not the subject of this email. This email is about incorrect
questions in the C language test. I wrote one mail earlier about the
same issue (to hr-exec@netcloudsystems.com) but no one replied. Hence
you are receiving this email. Here is the technical issue:

I was given 20 questions in C language and only 18 belonged to C
language, other 2 were not. C language is defined by ISO committee
and this committee publishes the definition of the C language. You
can find the official-draft of the standard online here privided by
ISO committee at their site:

http://www.open-std.org/jtc1/sc22/wg14/

According to the definition of C language, C language does not have
any function named gcvt(). gcvt() was asked in one of the two
questions. Perhaps, gcvt() is some compiler-extension know to the
person who created the test but that does not come under C language.
And there are more than a bunch of excellent high-quality compilers,
you can write same C language conforming code in all of them but
different programmers use different compilers and that has nothing to
do with C language itself but the C language test provided by you
seems to confuse between the compiler and the language. Like I said,
I skipped over theses 2 questions. I think examiner should have given
me marks for these 2 questions, else it would be unfair. I am
attaching the PDF of the latest standard for your technical team to
look at themselves.

Now it is not just about me, it is about all the
programmers/developers who appear in interviews of Net Cloud Systems,
it will be same way unfair to all of them, not to mention lack of
knowledge on your part. I hope you will look into it. Thanks for
reading my email.

 Arnuld Uttre


HR-NECS Wed, Dec 24, 2014 at 10:39 AM
To: arnuld uttre
Hi Arnuld,

First of all I would like to say that you could not clear the test.

Their is no mistake in the questions, one should have good and depth knowledge on C and Linux platform only then they can answer the questions.
Please correct your facts first and raise a question. The question that you got in the online test were not repaired by some freshers or 1-2 years of exp person.
So for you knowledge please go through some links below and a attachment.
These type of question in our company are answered by freshers or 1-2 yrs of exp employee.

http://sydney.edu.au/engineering/it/~kev/pp/RESOURCES/cplusplus/ref/cstdlib/gcvt.html
Go to root terminal and type: “man gcvt”

Their are many things that keep coming in C language. It is very vast subject. People who have 10-12 years of exp only on C and Linux platform rate themselves 3.5/5 on C programming. How much would you rate your self ?

Hope you got your answers.
Thank you for reading my mail and thank you for your mail.

Regards,
[NAME OF HR HIDDEN]
HR-NECS


wrote:
> Hi Arnuld,
>
> First of all I would like to say that you could not clear the test.
>
> Their is no mistake in the questions, one should have good and depth
> knowledge on C and Linux platform only then they can answer the questions.
> Please correct your facts first and raise a question.

Oh my dear Vikas….

First of all I did not mean “no disrespect”, I am just trying to tell
you something which is “not correct” about your test but it seems like
you are ready to burn me alive. Please do not let your ego come in
between you and the learning. You can either read my email and do the
search yourself or just simply can get angry and call me a dog:

I got the facts correctly, down here is the proof :

http://sydney.edu.au/engineering/it/~kev/pp/RESOURCES/cplusplus/ref/cstdlib/gcvt.html

You sent me this link. Did you even read that page yourself ? It
says gcvt() is not part of ANSI C:

Portability.
Not defined in ANSI-C, but included in some compilers.

You see the link you sent me itself says, it is not part of C language
but “some compilers” have it and that is what I wrote in my last
email. Hope you trust Microsoft Corporation when it says, gcvt() is
not in C language:

http://msdn.microsoft.com/en-us/library/ms235405.aspx

Here is the code from the same page and output from an ANSI/ISO
conforming C compiler:

[arnuld@arch64 c $] cat gcvt.c
/* gcvt example */
#include
#include

int main (void)
{
char buffer [20];
gcvt (1365.249,6,buffer);
puts (buffer);
gcvt (1365.249,3,buffer);
puts (buffer);
return 0;
}

[arnuld@arch64 c $] gcc -ansi -pedantic -Wall -Wextra gcvt.c -lm
gcvt.c: In function ‘main’:
gcvt.c:8:3: warning: implicit declaration of function ‘gcvt’
[-Wimplicit-function-declaration]
gcvt (1365.249,6,buffer);
^

[arnuld@arch64 c $] gcc -ansi -pedantic -Wall -Wextra gcvt.c
gcvt.c: In function ‘main’:
gcvt.c:8:3: warning: implicit declaration of function ‘gcvt’
[-Wimplicit-function-declaration]
gcvt (1365.249,6,buffer);
^
[arnuld@arch64 c $]

> Go to root terminal and type: “man gcvt”

I did dear before you even sent a reply, and it says “LEGACY function,
removed. Please use sprintpf() instead”. It was a POSIX function, it
IS not a POSIX or C function, it WAS a POSIX fumction and It has been
removed back in 2008, just like K&R C is deprecated where we never use
to include any information about function arguments.

> Their are many things that keep coming in C language. It is very vast
> subject. People who have 10-12 years of exp only on C and Linux platform
> rate themselves 3.5/5 on C programming. How much would you rate your self ?

I leave that rating factor upto you now since you can figure it
yourself whether gcvt() is a part of C language or not. You told me
explicitly that test was not created by some freshers. I can agree to
that because in 5 years I have met only 2 programmers who really knew
C language and they were not much experienced but very good at C and
programming in general, better than me. Majority of the software
engineers in India, with many years of experience, do not know much
about basics of C because they learned from college and college books
are just the worse part of the story of C learning. Most never
learned C after college because C is not of much help in
employability. It ain’t their fault, it is the Indian education system
and the industry requirements.

You took it personal than keeping an open mind to understand the
difference between a language, compiler and the environment in which
both language and compiler exist.

> Hope you got your answers.

I hope you got yours. I already had this answered from students of
Late Dennis M Ritchie. draft of ISO Standard is attached with this
email just like my earlier email, please do read it. Thanks for your
time.

P.S. Software is not just about coding, it is about understanding
people first, almost half of good habits/practices of software
development/engineering are built on understanding people. Listen to
Google I/0 2009 talk on The Myth of Genius Programmer. May God bless
you

Arnuld


HR-NECS Wed, Dec 24, 2014 at 12:59 PM
To: arnuld uttre
Hi,

Lets not take this further.

Thank you for the mail and the valuable information.

Thanks and Regards,
[NAME OF HR HIDDEN]

Well I did exaggerate a bit that I got answer from Late Great Dennis Ritchie‘s students 😉 . Personally, I don’t  know any of Ritchie’s students. I sure as hell learned good amount of programming from great programmers including those who have worked with Dennis Ritchie. I would not have become good at C without their mentoring. One day after this happened, I watched “the myth of genius programmer” talk given in Google I/O 2009 by 2 Google developers: Brian Fitzpatrick and Ben Collins-Sussman. They have talked one very important thing related to the great programmers around the world. They talk about how much important it is be humble, flexible and devoid of ego to become a great (or genius as they call it) programmer. How much it is important to respect your peers and their advice and suggestions when they just walk through your code. It is called peer-review and it is one of the pillars of GNU, Linux, BSD and all Open-Source software communities and they mentioned explicitly in their talk that peer-review happens in google all the time. peer-review is one of the greatest strengths behind the better quality of Open-Source software compared to proprietary software. I never had big ego, on the contrary I have always seen myself as a kind of small and short being and I have listened to knowledgeable programmers half my age. In WIPRO I was on the ODC of MasterCard and I learned more qualities there, I learned being humble, soft and and became more flexible. Not only my teammates but my team manager and project manager were great people too and I think I worked with one of the best people in my professional experience.

Completely opposite to WIPRO, do you see the ego coming out of the email from Net Cloud Systems HRD, and dancing in front of your face. Rather than looking for the facts, this HR person totally closed his mind to new information, the information which could have corrected not only their test questions but could have saved them from future embarrassment from some talented programmer. Arrogance instead of improvement. With this kind of mindset, no company can hire good talent. If a company can not understand that a programmer who knows about the cons-correctness, why int main(void) is better than void main(), is better than an ordinary programmer then you should never work for such company. I thank God I did not clear the test and they did not give me those marks I asked. Otherwise, if they have this much of attitude before hiring I wonder what would happen after one joins the company and gives some different but creative programming idea to solve some serious software problem. A good and talented programmer can not stop the flow of creativity, he would suffocate and die a slow death at a workplace where his ideas are suppressed. In 5 years, I have heard of some companies like this, companies who pay much less amount of money to programmers (freshers mostly) and kill their creative mind by bureaucracy but I never had personal experience with them, now I do. I watched Google I/O talk just next day. I thought it was just a co-incidence but now I think, it was God’s guiding hand telling me to apply for better companies, to look for places where problems are solved with different ideas than egos and where creativity flourishes. You should watch Google Talk, Brian and Ben gave a great talk, it is available at youtube. Programming is about passion and interest. Don’t work for those who can not grasp this, if you want to be a happy-coder.

The Myth of genius Programmer

Copyright © 2014 Arnuld Uttre, Hyderabd, Telangana – 500017 (INDIA)
Licensed Under Creative Commons Attribution-NoDerivs 3.0 license (a.k.a. CC BY-ND)

Emacs way – copying text

December 9, 2014 at 12:47 pm | Posted in Patterns, Programming | Leave a comment
Tags: , , , ,

In Emcas if you want to copy a region of text from one file to another then you can just press {C-space} as beginning of copying and then take your cursor to the point till where you want to copy. Then you press {M-w}, M means meta/Alt key and then you will go to the file you want to paste to and put your cursor at the place and press {C-y} and its done. It may look complicated to people who have used Notepad/Wordpad/MS-Office for many years who can just use mouse to copy-paste. Well, it is same except that using keyboard gets much easier over time, plus it kinds of wires into your nervous system. Using mouse to do something never gets easier over time, it remains same.

Now behind the scene, Emacs uses a function called (append-to-buffer) and if you look at the pseudo-code or algorithm, this is how it looks like:

(let (bind-oldbuf-to-value-of-current-buffer)
   (save-excursion                           ; Keep track of buffer.
     change-buffer
     insert-substring-from-oldbuf-into-buffer)
   change-back-to-original-buffer-when-finished
let-the-local-meaning-of-oldbuf-disappear-when-finished

Compare this with how it works in C:

  1. open file for reading, the file you want to copy from
  2. if there was no error in step 1 then open file for writing, where you want to paste
  3.   if there was no error in step 2 then check if mark has lower value than point
  4. use fseek to go to the mark
  5. if there was no error in step 4 then read/copy one character and write/paste it
  6. check if copy/paste stopped because of end of work or because some error occurred in copying.
  7. check if copy/paste stopped because of end of work or because some error occurred in pasting.

Here is the code in both languages:

(defun append-to-buffer (buffer start end)
  "Append to specified buffer the text of the region.
     It is inserted into that buffer before its point.

     When calling from a program, give three arguments:
     BUFFER (or buffer name), START and END.
     START and END specify the portion of the current buffer to be copied."
  (interactive
   (list (read-buffer "Append to buffer: " (other-buffer
					    (current-buffer) t))
	 (region-beginning) (region-end)))
  (let ((oldbuf (current-buffer)))
    (save-excursion
      (let* ((append-to (get-buffer-create buffer))
	     (windows (get-buffer-window-list append-to t t))
	     point)
	(set-buffer append-to)
	(setq point (point))
	(barf-if-buffer-read-only)
	(insert-buffer-substring oldbuf start end)
	(dolist (window windows)
	  (when (= (window-point window) point)
	    (set-window-point window (point))))))))
int copy_buffer_richard(const char *w, const char *r, int pf, int pt)
{
  int rc = 0;
  FILE *fpi = fopen(r, "rb");
  if(fpi != NULL)
    {
      FILE *fpo = fopen(w, "wb");
      if(fpo != NULL)
	{
	  int len = pt - pf;
	  if(pt > 0 && pf >= 0 && len > 0)
	    {
	      /* Everything so far has been housekeeping.
		 The core of the code starts here... */

	      if(0 == fseek(fpi, len, SEEK_SET))
		{
		  int ch;

		  while((ch = getc(fpi)) != EOF)
		    {
		      putc(ch, fpo);
		    }

		  /* ...and ends here. From now on, it's
		     just a load more housekeeping. */

		  if(ferror(fpi))
		    {
		      rc = -5; /* input error */
		    }
		  else if(ferror(fpo))
		    {
		      rc = -6; /* output error */
		    }
		}
	      else {
		rc = -4; /* probably the in file is too short */
	      }
	    }
	  else {
	    rc = -3; /* invalid parameters */
	  }
	  fclose(fpo);
	}
      else {
	rc = -2; /* can't open output file */
      }
      fclose(fpi);
    }
  else {
    rc = -1; /* can't open input file */
  }
  return rc;
}
/* by Richard Heathfield */

Comparing both, to me Emacs Lisp code is much more easier to understand than C code. C code may look prettier but that is because of lot of extra whitespace around it where Emacs Lisp code in tightly placed. You should look at the pseudo-code of Emacs Lisp on how easier it make connection between pseudo-code and real code. It reads almost like English while C version is, as usual, strikingly odd, pseudo-code and real code look a lot different, typical of C. You may say that comparison is unfair because C is much faster comparing to Emacs Lisp and one file in Emacs Lisp was already opened and I am comparing a full fledged Lisp environment with just one single C program. Yeah, I get that, but then again Emacs Lisp code is real code directly taken from source code of Emacs while C code is just written a stand alone, small and short program. Real C program taken from a real life working software will be a lot creepy. In one glance at pseudo-code and real code, you can guess what Emacs Lisp code is doing and it is easier on head whereas real life C code will require lots of glances and will definitely be far from easier on head.

Emacs Lisp version is much more readable and this is a very important point. Ever heard of the sentence called “developer’s time is more important than the machine time” or “a computer program is written once and read 10,000 times” or “Programs must be written for people to read, and only incidentally for machines to execute (Abelson and Sussman, Preface to the First Edition, SICP) . Last quote is from one of the most respected books in computer science. If you think those ideas are quite academic or theoretical then you are completely missing the point. Good ideas are not only hard to grasp at first but it is difficult to notice the practical benefit of those too, especially if you are not having few years experience in programming. No matter how much industry is crying about changing customer requirements, good ideas are timeless. These changing customer requirements are nothing but problems that computer programmers solve everday. If, at your workplace,  you work mostly in C and C++, you must have noticed almost every company has moved to C++ while two decades back they used to develop mostly in C. More than 65% of the code in this entire world is still in C, but most of it is legacy-code.  There is a shift in the thinking that has happened. The programming world keeps on churning out new languages and almost everyone is moving towards the use of languages like C++, Java, Python, Ruby etc. Why is that ?  If you look at the new languages, you will notice they were designed more on the side of how to solve the problems in a better way, how can this new language work as a better and improved tool towards solving the problems in or of this world, and indirectly (and may be unknowingly) these language-creators have no interest solving the problems of the machine itself (space and time complexity) because problems of the machine and problems of this world are two points that lie on opposite ends. You can not brilliantly solve the one without ignoring the other by a good  amount. C++ was created to solve the problems of large scale software design and hence OO and generic programming paradigms were added. Rather than how to make it more efficient than C, the notion of how to make it better at solving larger problems was choosen. Ruby, Perl, Python and lot of others were created primarily to solve the problems that are not related to machine’s own problems. World is moving from machine towards abstraction. I call it moving to solving problems of this world, moving towards generlization and abstraction, Paul Graham calls it moving from C model to Lisp Model and he is right. Humans always evolve, no matter how many wars and world wars have been fought where humans swore to kill each other, no matter how much negativity and selfishness is there in this world, humans have always evolved and this shift from solving problems of machine to solving problems of this world is a step in further human evolution. Richard Stallman had already evolved to this level by 1984 (along with many other great progrmmers. Good thinking is timeless). He focused more on solving the problem and created this amazing piece of software called Emacs. Thanks to him again.

You should try this book by Robert J. Chassell, it is kind of addictive. When I get some free time it makes me think whether I should entertain myself with a movie or should I just enjoy reading his book  🙂

Copyright © 2014 Arnuld Uttre, Hyderabad, Telangana – 500017 (INDIA)
Licensed Under Creative Commons Attribution-NoDerivs 3.0 license (a.k.a. CC BY-ND)

C++ new() operator

June 28, 2012 at 7:17 pm | Posted in C++, Programming | Leave a comment
Tags: , , ,

I was working on adding some features to a software written as a mixture of C and C++ and I came to realize many C++ programmers write C in C++. Take a look at this:

#include <iostream>
#include <new>

int main()
{
  char * t = new char[1];

  if(!t) 
    {
      printf("Memory Exhausted\n");
      exit(EXIT_FAILURE);
    }

  t[0] = 'A';

  printf("t[0] = %c\n", t[0]);
  return 0;
}

Everything looks fine and g++ (on RHEL 5) even compiles/runs with flags (-ansi -pedantic -Wall -Wextra) and without any warning/error. Program just seems to be technically correct (which it is seems like but isn’t) and prints the value inside array as expected. Now let us take a more basic look at this. Why we are using printf() in a C++ program when C++ has its own standard library ? The program we have writen is actually C in C++. It is like using a powerful mechanism and throwing all the powerful tools/methods away because you don’t want to know about them. Many industrial programmers don’t want to know about it because life goes on fine without knowing about it and they are still earning much higer salaries without knowing it (and they will keep on increasing their monthly income by impressing HR guys with a bag of languages and big projects on their Resumes). Hence Why bother ? Wrong reasons. If you are really looking for laziness then find it elsewhere because laziness equals to the amount of bugs in programming. Rewrite it the C++ way:

#include <iostream>
#include <new>

int main()
{
  char * t = new char[1];

  if(!t) 
    {
      std::cerr << "Memory Exhausted" << std::endl;
      exit(EXIT_FAILURE);
    }

  t[0] = 'A';
  std::cerr << "t[0] = " << t[0] << std::endl;

  return 0;
}

It is still not C++. What we call it now is a mixture of C and C++ provided the programmer does not know about C++ much. He was basically a C programmer and was either forced to use C++ compiler or was too lazy to know C++. Again it compiles/runs fine as it looks technically correct. check out new operator in section 18.6.1 of current C++ standard (you can check out draft of the standard, just google for N3337.pdf). new does not return NULL, hence the check is wrong. new throws bad_alloc() if it can’t allocate memory. Hence the technically correct version looks like this:

#include <iostream>
#include <new>

int main()
{
  char * t;

  try { t = new char[1]; }
  catch(bad_alloc)
    {
      std::cerr << "Memory Exhausted" << std::endl;
      exit(EXIT_FAILURE);
    }
  
  return 0;
}

This will never compile. Why ? Because you did not mention where bad_alloc is coming from. It is in standard library, hence you need to use std::bad_alloc. If you think you simply dump the whole standard namespac by using using namespace std in there, then you really need to read C++ FAQs before writing C++ programs any further. You need to think why I am writing std::cout instead of usual cout used by typical Indian programmers. Let us try one more time:

#include <iostream>
#include <new>

int main()
{
  char * t;

  try { t = new char[1]; }
  catch(std::bad_alloc)
    {
      std::cerr << "Memory Exhausted" << std::endl;
      exit(EXIT_FAILURE);
    }

  t[0] = 'A';
  std::cout << "t[0] = " << t[0] << std::endl;

  return 0;
}

This seems like pure C++. Yes, it is. Sure ? We still have one general programmig problem remaining to be solved. If you call exit() then you are not being practical, e.g. you wrote a client which connects to a server. One of the users of your software is connected and suddenly he is out of memory, then you program will just disconnect without saying a bye. Server will not like it and may log it as an error or will wait for an automatic timeout.

That was a general exmaple, let us look at more technical example. When a game adjusts your resolution to 640×480 and resets it back to normal (say 1280×1024), it will call destructor on 640×480 in resetting but it will not do so because exit() will not call the destructor, you will get stuck in a low resolution screen. It happens when some games crash without throwing an exception and rolling back the stack. So what do you do ? Let us try one last time to write pure C++ code 🙂

#include <iostream>
#include <new>

int main()
{
  char * t;

  try { t = new char[1]; }
  catch(std::bad_alloc)
    {
      std::cerr << "Memory Exhausted" << std::endl;
      return EXIT_FAILURE;
    }

  t[0] = 'A';
  std::cout << "t[0] = " << t[0] << std::endl;

  return 0;
}

NOTE: There is still a way if you want to check for NULL (instead of catch()ing an exception). You can use the nothrow version of new operator which returns a NULL pointer instead of throwing an exception but you have to mention it explicitly.

 


Copyright © 2012 Arnuld Uttre, Village – Patti, P.O – Manakpur, Tehsil – Nangal, Distt. – Ropar, Punjab (INDIA)

Verbatim copying and distribution of this entire article are permitted worldwide, without royalty, in any medium, provided this notice, and the copyright notice, are preserved.

The Real Programmer

March 19, 2012 at 11:04 am | Posted in Programming | Leave a comment
Tags: , , , , ,

I was checking out what new language to learn. There are several points here:

  • Language: Most newbies or less experienced programmers think of learning a new langauge and thats it. They think learning more languages will make them better programmer. Unfortunately this is not true.
  • New Paradigm : Other experiences programmers want to learn a new paradigm which will change their way of thinking and make thema better programmer rather than a programmer who knows several languages. He thinks that learning a language like C++ wil automatically make him an OO expert. Sigh…. he got immature mindset too.
  • Reality Check : No matter what a programmer wants to do, either of the above or both, his thoughts are crushed by the reality of the software as an industry. He works whole day and then he has a family and he wants to have a life too and there are only 24 hours in a day. Out of all this mess and busy schedule, he starts thinking that he can not afford to spend time learning a langauge which does not give him a rise in his income.
  • RealProgrammer : . Now there is another breed of programmers, which I call real programmers (I am one of them. What you think ? … No ? … c’mon just believe it because I am the author of this post 😉 ) Here the real programmer, I mean the one who does not believe in quick fixes, the one who started programming because he likes it, because he is happily willing to live next 20, 30, 40, 50 years of his life writing code, THAT ONE decieds to go long term. Rather than deciding on income-factor he goes with programming-factor, he decied to learn new-paradigm, decides to check out something unheard in industry but heard a lot from the mouths of good programmers.

Learning programming for income is like a adding one more language to your Resume and that stops right there and it adds not much to your skill as programmer. I think you must aim for getting more out of the time you spend, you must aim differently, you must aim what your common-sense thinks is right. Unfortunately most programmers don’t have that common-sense because industry is full of programmers who do it for money just like a fruit-seller who sells fruits for money but himself does not eat much of them because he is not interested in how fruits lead to good health. My advice will be wathcing and observing what all brilliant programmers are doing from years and learn from them. Thats what I do.

I am a C Programmer and I wanted that new language to help rise in my career too. Of course the choice came out to be C++. But C++ is almost in the same paradigm as C plus more. C is procedural while C++ has OO and generic paradigms added to and it is designed in such a way that you can add a lot of other paradigms to it but C and C++ belong to almost same kind of mindset. I wanted to write a microkernel for Hurd, hence I dwelled into other languages like BitC and decac etc. but then again lack of time and my focus on what can I do to become better programmer and use my time with maximum productivity. Here are the options I think I have found:

  • Haskell
  • ErLang
  • Common Lisp
  • Python
  • Ruby
  • Ada
  • Caml
  • BitC
  • decac
  • Eiffell
  • RISC Assembly
  • D Programming Langauge
  • Prolog
  • C++

Now, I can’t learn everything, it will take 2 lives to finish this list off. So after lot sof googling, lots of readings of practical views, research papers etc etc I selected Common-Lisp. Lisp is 2nd oldest language still in existance after FORTRAN. Lisp has a changed a lot since then. Code and Data are same in Lisp. Many concepts were developed first in Lisp and then in other languages e.g. garbage collection. You can write Lisp code which will write Lisp code, its like creating a new language yourself. I learned about recursion in 7 days which I struggled to learn for 4 years with C and C++. I learned Binary-Search in 5 minutes which I am trying from last year to understand with C, in C you struggle more with how to write in C rather than the abstraction of the problem and its solution. (No wait… I am not attacking C, Not at all. C is a great language to learn to know about pointers which Lisp intelligently hides. You must learn both C and Common-Lisp if you are serious about programming.) For Managers Common-Lisp has OO and the next generation fancy (but practical) words e.g. MOP (Meta-Object Protocol if you have never heard of it). There are lot of strange languages and I don’t know why Common-Lisp impressed me so much. So far I have seen only one company in India using it.

Bottom line is: If you want a job, learn Java, C#, .NET or C++ . If you want to be a better programmer and willing to spend next 20 years of your life writing code, you better learn C and Common-Lisp and yeah arrays and pointers are not same and code is data in Lisp. The point is not to run after money but specizlized skills in programming. Specialized skill over long-term attracts money automatically.

 


Copyright © 2012 Arnuld Uttre, Village – Patti, P.O – Manakpur, Tehsil – Nangal, Distt. – Ropar, Punjab (INDIA)

Verbatim copying and distribution of this entire article are permitted worldwide, without royalty, in any medium, provided this notice, and the copyright notice, are preserved.

The Craft of Programming

August 31, 2009 at 11:16 am | Posted in Patterns, Programming | Leave a comment
Tags: , , , , , ,

Here are some quotes I have gathered over the years. They are written by some of the best known Programmers and Hackers with occasionally some very good programmers thrown in, if not great. They inspired me, changed the way I look at programming and especially at some programming languages and methods to solve problems:

“Any sufficiently complicated C or Fortran program contains an ad hoc informally-specified bug-ridden slow implementation of half of Common Lisp.” Philip Greenspun


“Something we didn’t want was an object-oriented language. OO languages remain a popular fad, but our experience using C++ in the EROS system was that it actively got in the way of understanding what was going on.”

The Origins of the BitC Programming Language


When you want to use a language that gets compiled and runs at high speed, the best language to use is C. Using another language is like using a non-standard feature.
GNU Coding Standards


“First off, I’d suggest printing out a copy of the GNU coding standards,
and NOT read it. Burn them, it’s a great symbolic gesture.”
Linux kernel coding guidelines


“C++ will rot your brain”
— someone from #lisp at irc.freenode.net


“pointer arithmetic and array indexing [that] are equivalent in C, pointers and arrays are different.” Wayne Throop


“An array is not a pointer, nor vice versa” — Steve Summit in C FAQs


“Attitude is no substitute for competence”
— Eric S. Raymond in How to become a Hacker


Q: I’m having problems with my Windows software. Will you help me?

A: Yes. Go to a DOS prompt and type “format c:”. Any problems you are experiencing will cease within a few minutes.

Eric S. Raymond


“This answer cannot be decided by current law—the law should conform to ethics, not the other way around” — Richard M. Stallman


“Lisp is a programmable programming language.”
John Foderaro, CACM, September 1991

Q: “My company needs a proprietary operating system to get a competitive edge.”

A: GNU will remove operating system software from the realm of competition. You will not be able to get an edge in this area, but neither will your competitors be able to get an edge over you. You and they will compete in other areas, while benefiting mutually in this one.


“There is nothing wrong with wanting pay for work, or seeking to maximize one’s income, as long as one does not use means that are destructive. But the means customary in the field of software today are based on destruction.” — Richard M. Stallman


“Haskell saves lives


“In general, functional languages offer powerful new ways to encapsulate abstractions” — Haskell Wiki


“I invented the term ‘Object-Oriented’, and I can tell you I did not have C++ in mind.”
— Alan Kay.


“C++ is the only current language making COBOL look good”
Bertrand Meyer


“It’s 5.50 a.m…. Do you know where your stack pointer is ?”
— Anonymous


“I understand the philosophy that developer cycles are more important than cpu cycles, but frankly that’s just a bumper-sticker slogan and not fair to the people who are complaining about performance.”
Joel Spolsky


“The standard — either one — is not the End of All C. Writing ‘strictly conforming’ C code, however, has an enormous benefit.”
Chris Torek


“Wait a minute, I want to modify that statement. I’m not claiming, in this particular article, that there’s anything wrong with Java as an implementation language. There are lots of things wrong with it but those will have to wait for a different article.” — Joel Spolsky


“Without understanding functional programming, you can’t invent MapReduce, the algorithm that makes Google so massively scalable”
— Joel Spolsky


“It [Java] might be successful – after all, MS DOS was – and it might be a profitable thing for all your readers to learn Java, but it has no intellectual value whatsoever. Look at their implementation of hash tables. Look at the sorting routines that come with their “cool” sorting applet. ”
– Alexander Stepanov


“Java isn’t platform independent; it is a platform. Like Windows, it is a proprietary commercial platform. ”
Bjarne Stroustrup

 

 


Copyright © 2006, 2007, 2008 Arnuld Uttre, #331/type-2/sector-1, Naya Nangal, Distt. – Ropar, Punjab (INDIA) – 140126

Verbatim copying and distribution of this entire article are permitted worldwide, without royalty, in any medium, provided this notice, and the copyright notice, are preserved.

Next Page »

Blog at WordPress.com.
Entries and comments feeds.