Things they don’t teach in college – 1

I spent most of my life working in small companies in Egypt, companies with low technical and managerial level. When I moved to, I saw a whole new world of things that I was missing, and the most important of those things was not technical but related to the way I think. Today and after more than two years, I still find myself missing a lot and learning  more about my weak points every day.

When I started doing interviews, and through interviewing training, discussions with other developers making interviews, and talking to candidates from other backgrounds and ways of thinking, I was able to start putting those thinking skills I missed before into solid description in my mind. A large portion of people who fail interviews fail for missing some of those thinking skills, even if they can code well.

In this series of posts I will try to talk about those thinking skills I was / still missing.

Understanding company’s culture

“The notion that diversity in an early team is important or good  is completely wrong. You should try to make the early team as non-diverse as possible.” Max Levchin, a founder of PayPal.

Diversity is a double edged sword: it helps innovation, solving different problems, allowing a group of people to cover different aspects related to a given domain or problem with good mix of depth and breadth, but some differences in the way people work or think can hinder the overall progress of the group.

Every company has a culture, things they consider valuable, other things that they can sacrifice to a given limit, and things they totally refuse to do. There are a lot of successful companies in the world, on both business and technical levels, with different values, principles and overall mentalities, so one way is not essentially better than the other but what worked for each of them is different.

Lets talk about one principle as an example. Do you remember how many years gmail was in beta version? more than 5 years (1st of May 2004 – 7th of July 2009). Google’s quality assurance follows the principle of (no corner case uncovered), so they have lots of testing, code reviews, reviews from site reliability engineers  in different development stages, long beta testing, you name it. Code deployment and release follows a strict procedure.

On the other hand, follows a strategy of  (focus on monitoring not testing). So any developer (even graduates) can deploy any sub system or the website itself with no limitation. After initial testing by the developer himself, testing is done using live traffic, directing live traffic to one server with the new code, then deploying new code to a fraction of servers, then to all servers, with efficient monitoring and alerting during and after all those steps. If an error is found, the developer can quickly roll back to the previous working version at any time. Rolling back hundreds of servers to a given code version takes very few minutes. There is a budget for damage caused by errors and outages (this damage will be mostly lost reservations). accepts a cost for having a very quick feature delivery process, this cost is spent on developing complex monitoring systems, efficient deployment system and lost reservations.

Facebook follows a similar strategy to’s.

Google cannot do the same because outages in google’s systems does not mean lost reservations from customers who will probably try again some other time, it can affect other companies building business on google’s platform. Also scale is different, building platforms to be consumed by other developers has its implications on release cycles, features changes and depreciation, documentations, etc.

Approach towards quality is one aspect of the company culture, there are many more.

Understanding yourself and the company you are about to join lets you easily know that you may or may not fit in this company. Very few people can say ( I am a good developer, and this is a good company but I don’t fit there because I value x or I am good at doing x and they do y or want someone who can do y).

In I was astonished to hear statements like ( If I was in Google or Amazon, I would have suggested x, but since we are in, I suggest y). I found that good developers have good understanding of the company’s culture: different principles the company values, how they relate to the company’s business, when to suggest changing a given principle as the company’s size grows or business criteria change, how different technical decisions fit within the company’s culture, etc.

Also, being able to work in multiple cultures is a sign of flexibility. At when we interview someone and find that he comes from a company culture or mentality that differ from ours in one or more aspects we explain to him how we work and see how he reacts. If he is able to reason about it, find its weakness and strength, asking correct questions about it, then we put this as a positive sign for him being a flexible person. Of course the ability to reason about a given company culture doesn’t happen while he is sitting in the interview. If he is aware of the company culture in his current company, reading about company culture in different famous companies and thinking of it then he will be able to reason about  new aspects of any other company’s culture and mentality.

كيف تتعلم البرمجة

أتلقي الكثير من الأسئلة التي تدور حول (كيف أتعلم البرمجة) أو (ما هي لغة البرمجة التي يجب أن أبدأ بتعلمها) أو (من أين أبدأ)، مما دفعني أن أكتب هذا المقال الصغير. موضوع تعلم البرمجة فيه الكثير من الآراء والنظريات وتقريباً لا يوجد فيه رأي قطعي ومقالي هذا لن يختلف كثيراً، هو مقال يحتوي وجهة نظر وليس حقيقة لا تقبل الجدل. Continue reading “كيف تتعلم البرمجة”

Performance Benefits of Dynamic Compilation

Dynamic compilation is the process of compiling code at runtime. This code could be an intermediate language code or could even be a binary code that is re-optimized at runtime. Dynamic compilation of intermediate code is the technique used in compiling java and .net code.

In this article I will discuss the performance benefits of dynamic compilation in general with some focusing on dynamic compilation on the .net platform. Continue reading “Performance Benefits of Dynamic Compilation”

Reddit and Filtering by Design

Reddit is a social news website, where a user posts links to pages on the internet, and then other users up vote or down vote this link. The links are organized Based on the votes and the time since the link was posted.

I have been a user for Reddit for more than a year now. The idea is not totally new, Digg already has the same idea, but the content on Reddit is much better than Digg. Digg is full with (cool stuff), links to topics and pages that tend to be nice, funny, weird, things that could appeal to the masses, but Reddit is much more serious and useful, and the links tend to appeal to the more cultured or intelligent reader. Of course the number of Reddit users is less than that of Digg. Continue reading “Reddit and Filtering by Design”

عن المبرمج نتحدث – 3

المبرمج يولد مبرمجاً

هل هناك فارق بين الناس في مدي قابليتهم لتعلم البرمجة؟ هل هناك أشخاص لا يمكن تعليمهم البرمجة أم أن أي شخص يمكنه أن يكون مبرمجاً؟ بعبارة أخري، هل يولد المبرمج مبرمجاً أم أن المبرمج يمكن صناعته بالتعليم و الممارسة؟

هذه التساؤلات هي نقطة خلافية كبيرة بين عدد كبير من المهتمين بصناعة البرمجيات عموماً. هناك فريق من الناس يري أن المبرمج يولد مبرمجاً. هو شخص لديه القدرة علي فهم علم البرمجة بسرعة و عادة ما تكون كفاؤته أعلي بكثير من كفاءة زملاؤه بسبب إستعداده الشخصي، و فريق آخر يري أن الموضوع متعلق بالتعليم، و أن الفارق بين مبرمج و آخر هو فارق في الكيفية التي تعلم بها البرمجة، و أن أي شخص يمكن أن يكون مبرمجاً إن مر بعملية تعليمية سليمة. Continue reading “عن المبرمج نتحدث – 3”

عن المبرمج نتحدث – 2

2 – شخصية المبرمج

بما أن المبرمج هو العامل الرئيسي في نجاح أو فشل المشروع، و بما أن البرمجة هي نتاج عقلية المبرمج الذي قد يختلف بناء علي حالته النفسية و العقلية من يوم لآخر، و بما أن البرمجة عمل جماعي يؤثر فيه المبرمج و كيفية تعامله مع زملاؤه كان من الضروري دراسة شخصية المبرمج، كيف يفكر، ما الذي يثير حماسه، ما الذي يحبطه، ما هي المشاكل التي تواجه المدير عند تعامله مع المبرمج، ما العوامل التي يمكن أن تؤثر علي إنتاجية المبرمج و جودة الكود الذي يكتبه، الخ. Continue reading “عن المبرمج نتحدث – 2”

عن المبرمج نتحدث – 1

تتميز صناعة البرمجيات بأنها صناعة تعتمد في المقام الأول علي المبرمجين. ليس هناك آلآت أو مواد خام أو تكاليف شحن أو أي عامل من العوامل التي تقوم عليها باقي الصناعات، فقط المبرمج. من هنا كانت تكلفة المشروع هي في المقام الأول أجر العاملين في المشروع (رواتبهم الشهرية) ، و بالتالي إن أمكنك تقدير الوقت المتوقع للمشروع بدقة أمكنك أن تقيم تكلفة المشروع أيضاً.

من هنا تأتي الأهمية الكبيرة للمبرمج في صناعة البرمجيات، و هي أهمية بالطبع تفوق أهمية العاملين في أي صناعة أخري. أي برنامج هو نتاج عقل المبرمج بشكل رئيسي، و بالتالي فإن المبرمج هو أهم العوامل التي يتوقف عليها نجاح المشروع من فشله. Continue reading “عن المبرمج نتحدث – 1”

Test Driven Architecture

In the latest issue of the Architecture journal, Mario Cardinal wrote an article called Test Driven Infrastructures in which he discussed the idea of test driven architecture. He said that it is a good way of documenting the code, avoiding regression bugs and making sure that the developers are sticking to the requirements and the design.

I think of test driven development to be something that makes sure that you reach the end goal without checking the way you get there. See the following example situation:

 I am designing an application that gets some data from the database and display them for the user. I choose to use N-Tier architecture with 3 tiers, one for the database, one for the data access layer and one for displaying the data to the user. If I put a unit test for the use case of the user requesting the data to be retrieved and displayed, how can I test that the developer is sticking to the 3-Tier design that I have made? How can I make sure that he is not writing code in the presentation layer that connects directly to the database?

This is something that was not mentioned by Mario Cardinal in his article but was mentioned by Peter Provost in his short video about test driven design. He said that test driven design is used to test methods and classes, not the higher level architecture, and I think that the same principle of “testing the goal not the way to the goal” applies even to small methods and classes. If I put a design that included a method that takes an array and sorts it, and I said that I need the sorting to be done using x algorithm (for the sake of performance or memory usage or any other reason), how can I put a unit test that makes sure that the developer implemented it in the same algorithm that I explained to him?

Another difficulty in test driven development is creating the tests by someone who is not a tester (the software architect).  Design, development and testing are three different jobs that require different skills. A good developer or designer is not a good tester necessarily. See this blog for a discussion for the idea.

Of course there are benefits for test driven development or design, such as avoiding regression bugs and a good way for documenting the design (when combined with other design document and diagrams, not alone).

No silver bullet, the old immortal rule for software development. If you want to use Test driven development for its benefits, you should make sure that your unit tests are not the only tests you are using. Use also other testing techniques (for example peer review) to cover the holes left by your unit tests.

Construx Software Starts New Forums and Blogs

Construx Software, the software consultancy company of Steve McConnell -Author of Code Complete and Rapid Development– has started new forums dedicated for discussion of software best practices in management, requirements, Design, methods, etc. Steve McConnell is a member in this forum and shares in the discussions.

Also the company has started a series of blogs by a number of technology experts including McConnell himself.

The forums and the blogs are here.