What language do you program in?
How often do you get asked 'What language do you program in?'. A lot of agencies and employers seem
to be very language focused. My view is 'The language is just of a way of expressing the solution to a problem'.
When I first started software development (25 years ago) I felt that if you knew 3 totally different languages
(For example ALGOL68 Fortran and Cobol) then they provided a lot of different development paradigms and a good base to
learn a new language.
Current suggestions would be a highly structured type safe OO language (Java) a scripting/dynamic language (Python) and a
functional language (plenty to choose from Scala, Clojure, Erlang, but also some of the best Python code I have seen is functional).
What would I ask?
So are there more important things to ask or look for, Occasionally I see jobs where the requirements list includes
other things i.e. Multi Threaded or Network programming. So lets try some alternate questions.
How do you handle scalability?
More hardware (CPUS, Memory)? Better algorithms? Profiling code? N-Tier arcitecture.
At one time more hardware was seen as the cheap answer to this problem but although the hardware may be cheap the cost of running
it is not.
What are you going to do if management require scaling up by one order of magnitude, what about 2 orders (100) or even 3 orders?
I have been there design goal of a few hundred users, so design around 1000. Two years later we want to handle
10000-100000 users.
Can you handle short term scaling up, the company is running a promotion or releasing a new product and expect the system to have to
handle millions of requests as the adverts finish. An example of this was the day the Raspberry pi went onto
the Farnell and RS websites, the Farnell site could not cope, RS took a
different approach and pushed all the traffic to a simple low resource web page and probably was
running in the cloud where they could just keep adding/removing servers as required.
How do you handle concurrency?
Are you going to use Process, Threads, Asynchronous tasks. What are the problems of each, what are the benefits?
Is concurrency important for the problem being solved, would a light weight startup be more important?
With the arrival of Java, Threads where made very easy to create but if you end up with
6 threads active for every request you soon end up thrashing the system just managing the threads.
How do you handle data?
RDBMS, Flat Files, NOSQL database? What is important about the data? How big is the data? Is the access
mainly write/update or read? What is the update volume? Are the updates spiky, i.e. 90% in 60 minutes a day or
are they relatively evenly spread over time?
For example NOSQL solutions such as Cassandra provide solutions for some problems by dropping some of the features of an RDBMS (ACID).
How are you going to test?
Old school approach, some ad-hoc testing and then throw over the fence to 'Testing team'? Or new school, unit tests and a continuous integration server?
How do you handle failure?
The hard one? The main answer design for failure.
You could follow the Erlang approach 'Let it Crash' and manage restarts?
Use Exceptions to manage errors?
Some of my early development was on Tandem non stop systems where the tagline was "no single point of failure". The system
used message passing with the OS holding a copy of the message until you indicated that the processing
was complete, if the process crashed then the message could be resent to the backup.
How important is the data being processed? If you are processing a bank account update you need complete success or failure. If you are processing radar returns (blips), would you be better dropping that one blip and going on to the next one, the display still has the last 4 and there will be a new one in 15 seconds.
How do you handle Security?
There never seems to be a day without some story about data going missing, or systems being compromised.
What aspect of security? Password compromise? SQL Injection? Buffer overrun? Insider threat?
How can you contain the problem? How can you mitigate problems? How can you recover?
What is important to the business?
As a developer it is very easy to overlook this issue, but we do need to have some business awareness. We can get so focussed on delivering something that is technically excellent.
In the mean time another company has used different tools (php!, Python?) and created a product in a few weeks, so it cannot scale & cannot handle some edge cases.
Where they win is that they have customers generating revenue which they use to revisit the design whilst we have run out of funds. Have you been there?
What do I want from a language?
I want the ability to express a solution clearly. For some problem domains this may be a dynamic language and for others
a highly structured OO language may be appropriate. It will also depend on how long the code will live for, is this a
simple tool that is going to be used a few times, i.e. as part of a system migration then quick development is more
important than future maintainability.
What is important in a software developer?
I know from my involvement in developer recruitment (working for early stage startups) that the most important requirements to me are:
- Self motivated
- Able to investigate solutions for themselves
- Quick learner
- Ability to communicate using a mixture of means, i.e. face to face, email etc.
- Can do attitude.
No mention of language there so far. I would probably list a language but I would be open to talking to anyone with good solid development background.