Showing posts with label technology. Show all posts
Showing posts with label technology. Show all posts

Wednesday, January 15, 2014

Clean Coding Techniques and Best Programming Practices

One of my favourite things to do when I'm free is open a code file from one of the best known open source projects and look at the code. Some of them programmers are truly amazing in writing codes applying the best coding practices and use OOP concepts. There are many good ways to architect and design a system depending on the size of the project. Those days, I was working on many small projects and now have the opportunity to work in fairly big scale projects and when I see the deferences and techniques used comparing to the small projects, I understand how clever some of these software engineering human beings are. Some of my colleagues could explain me, a complex concept I wouldn't understand reading books, in few minutes. Learning and understanding some fascinating facts form superiors while working's very valuable.  Sometime a line could explain you whole lot than a whole page ever could explain. Example ha?..
“ Java is to JavaScript what Car is to Carpet. ” - Chris Heilmann
If you look at the code someone new written in your project, you will understand when I explain you the feeling of trying to swallow your food for lunch after looking at the code. On the other hand, some people just know how to make a bouquet out of a few code files. What I'm trying to get you to agree is that some projects are really a joy to work on just because of the way it's been designed, coded, managed and some projects are pain to work on.

As a programmer, it's very important for me to understand the basic concepts well and to use best practices out there. Ever since I sat for a lecture in Dr Even's class, I'm keen on learning these best practices and want to code like a pro. He teaches while writing codes like writing emails. The way he structures code, put them into different files with meaningful file names and getting it working; it's truly mesmerizing experience. He's able to show us examples of simple code to carry complex functionality. To be able write simple code to do complex things would be one the thing I really wanted to be good. So, whenever I come across articles about coding best practices and code samples, I add to my pocket and this post is a sum-up of the collection.

Clean Coding Techniques and Best Programming Practices
“Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.” - Martin Golding
COUPLING & COHESION

I really started to understand the importance of Coupling and Cohesion only after I started working for big projects and started seeing the deference. For this post sake, let's look at a little on this. Also, for my learning too, I'm going to browse my  pocket links on this topic and many other relevant topics and copy them here. I'll try to put all the links I referred for this post. I usually doesn't like to copy other people's work here, yet I don't think I have to re-write something is been already written nicely in books or in websites. I wanted to remind some of these things, so, I'm going to go through and whatever I find useful in these area, I'm going to copy here. Simple - ha?:)

Coupling is an indication of the strength of interconnections between program units. Highly coupled have program units dependent on each other. Loosely coupled are made up of units that are independent or almost independent. When I start writing code in the beginning, most the function or components I write will call other functions and they're interconnected. When I try to modify something, it's really a headache. After a while, if we look at the code, It's really a challenge to understand the code and modify and these changes are pron to many code breaks.

“ Before software can be reusable it first has to be usable. ” - Ralph Johnson

Obviously, it very hard to keep functions totally independent and in many cases, it's almost impossible to have modules completely independent of each other. The more connections between functions, the more dependency and more issues later. It wouldn't make much of a deference if it's a small project and absolutely no requirement to upgrade it in the future.

According to Clarlson, there are three factors: number of interfaces, complexity of interfaces, type of info flow along interfaces.

Want to minimize number of interfaces between modules, minimize the complexity of each interface, and control the type of info flow. An interface of a module is used to pass information to and from other modules. In general, modules tightly coupled if they use shared variables or if they exchange control info. Loose coupling if info held within a unit and interface with other units via parameter lists. Tight coupling if shared global data. If need only one field of a record, don't pass entire record. Keep interface as simple and small as possible.

Two types of info flow: data or control.

Passing or receiving back control info means that the action of the module will depend on this control info, which makes it difficult to understand the module. Interfaces with only data communication result in lowest degree of coupling, followed by interfaces that only transfer control data. Highest if data is hybrid. 

Ranked highest to lowest: 
Content coupling:
If one directly references the contents of the other. When one module modifies local data values or instructions in another module. (can happen in assembly language) if one refers to local data in another module. if one branches into a local label of another.
Common coupling:
Access to global data. modules bound together by global data structures.
Control coupling:
Passing control flags (as parameters or globals) so that one module controls the sequence of processing steps in another module. 
Stamp coupling:
Similar to common coupling except that global variables are shared selectively among routines that require the data. E.g., packages in Ada. More desirable than common coupling because fewer modules will have to be modified if a shared data structure is modified. Pass entire data structure but need only parts of it.
Data coupling:
Use of parameter lists to pass data items between routines.

Cohesion

Cohesion is the measure of how well module fits together. A component should implement a single logical function or single logical entity. All the parts should contribute to the implementation.

Many levels of cohesion: 

Coincidental cohesion: 
The parts of a component are not related but simply bundled into a single component. harder to understand and not reusable.
Logical association: 
Similar functions such as input, error handling, etc. put together. Functions fall in same logical class. May pass a flag to determine which ones executed.
interface difficult to understand. Code for more than one function may be intertwined, leading to severe maintenance problems. Difficult to reuse
Temporal cohesion:
All of statements activated at a single time, such as start up or shut down, are brought together. Initialization, clean up.
Functions weakly related to one another, but more strongly related to functions in other modules so may need to change lots of modules when do maintenance.
Procedural cohesion: 
A single control sequence, e.g., a loop or sequence of decision statements. Often cuts across functional lines. May contain only part of a complete function or parts of several functions.
Functions still weakly connected, and again unlikely to be reusable in another product.
Communicational cohesion:
Operate on same input data or produce same output data. May be performing more than one function. Generally acceptable if alternate structures with higher cohesion cannot be easily identified.
still problems with reusability.
Sequential cohesion:
Output from one part serves as input for another part. May contain several functions or parts of different functions.
Informational cohesion:
Performs a number of functions, each with its own entry point, with independent code for each function, all performed on same data structure. Different than logical cohesion because functions not intertwined.
Functional cohesion: each part necessary for execution of a single function. e.g., compute square root or sort the array. Usually reusable in other contexts. Maintenance easier.
Type cohesion: 
Modules that support a data abstraction.
Not strictly a linear scale. Functional much stronger than rest while first two much weaker than others. Often many levels may be applicable when considering two elements of a module. Cohesion of module considered as highest level of cohesion that is applicable to all elements in the module.

Ref: http://courses.cs.washington.edu/courses/cse403/96sp/coupling-cohesion.html - Thanks: Adam Carlson


Coding Standards and Code Reviews

Using good programming practices to create high quality code is important to produce quality software with high performance. A comprehensive coding standard encompasses all aspects of code construction and, while developers should exercise prudence in its implementation, it should be closely followed. Completed source code should reflect a harmonized style, as if a single developer wrote the code in one session. Adherence to a coding standard can only be feasible when followed throughout the software project from inception to completion. It is not practical, nor is it prudent, to impose a coding standard after the fact. Coding techniques incorporate many facets of software development and, although they usually have no impact on the functionality of the application, they contribute to an improved comprehension of source code. For the purpose of this document, all forms of source code are considered, including programming, scripting, markup, and query languages.

“Measuring programming progress by lines of code is like measuring aircraft building progress by weight.”
- Bill Gates  (co-founder of Microsoft)

When you write code, consider the following to improve performance, keep the coding clean and to reduce run time exceptions.

  • Declare All Variables - In some programming languages, like in JavaScript or in C#. A variable that is not declared will be created with a default type. Normally it will be implicitly created as a Variant. 
  • Avoid elusive names that are open to subjective interpretation, such as Analyze() for a routine, or jjK4 for a variable. Such names contribute to ambiguity more than abstraction.
  • In object-oriented languages, it is redundant to include class names in the name of class properties, such as Book.BookTitle. Instead, use Book.Title.
  • Use the verb-noun method for naming routines that perform some operation on a given object, such as CalculateInvoiceTotal().
  • In languages that permit function overloading, all overloads should perform a similar function. For those languages that do not permit function overloading, establish a naming standard that relates similar functions.
  • Use Strongly Typed Object Variables - Object variables represent pointers to COM objects. They can be declared in two ways, as follows: 
    • When you defect a variable As Object in Java or C# that variable can be used to represent any kind of object; this is a weakly typed object variable
    • Use the As keyword with the specific type of the object; this is a strongly typed object variable.
  • Names - Perhaps one of the most influential aids to understanding the logical flow of an application is how the various elements of the application are named. A name should tell "what" rather than "how." By avoiding names that expose the underlying implementation, which can change, you preserve a layer of abstraction that simplifies the complexity. For example, you could use GetNextStudent() instead of GetNextArrayElement().
  • Append computation qualifiers (Avg, Sum, Min, Max, Index) to the end of a variable name where appropriate.
  • Use customary opposite pairs in variable names, such as min/max, begin/end, and open/close.
  • Since most names are constructed by concatenating several words together, use mixed-case formatting to simplify reading them. In addition, to help distinguish between variables and routines/functions, use Pascal casing (CalculateInvoiceTotal) for routine/functions names where the first letter of each word is capitalized. For variable names, use camel casing (documentFormatType) where the first letter of each word except the first is capitalized.
  • Boolean variable names should contain Is which implies Yes/No or True/False values, such as fileIsFound.
  • Avoid using terms such as Flag when naming status variables, which differ from Boolean variables in that they may have more than two possible values. Instead of documentFlag, use a more descriptive name such as documentFormatType.
  • Even for a short-lived variable that may appear in only a few lines of code, still use a meaningful name. Use single-letter variable names, such as i, or j, for short-loop indexes only.
  • If using Charles Simonyi's Hungarian Naming Convention, or some derivative thereof, develop a list of standard prefixes for the project to help developers consistently name variables. For more information, see "Hungarian Notation."
  • For variable names, it is sometimes useful to include notation that indicates the scope of the variable, such as prefixing a g_ for global variables and m_ for module-level variables in Microsoft Visual Basic®.
  • Constants should be all uppercase with underscores between words, such as NUM_DAYS_IN_WEEK. Also, begin groups of enumerated types with a common prefix, such as FONT_ARIAL and FONT_ROMAN.
  • A tenet of naming is that difficulty in selecting a proper name may indicate that you need to further analyze or define the purpose of an item. Make names long enough to be meaningful but short enough to avoid being wordy. Programmatically, a unique name serves only to differentiate one item from another. Expressive names function as an aid to the human reader; therefore, it makes sense to provide a name that the human reader can comprehend. However, be certain that the names chosen are in compliance with the applicable language's rules and standards.
  • When naming tables, express the name in the singular form. For example, use Employee instead of Employees.
  • When naming columns of tables, do not repeat the table name; for example, avoid having a field called EmployeeLastName in a table called Employee.
  • Do not incorporate the data type in the name of a column. This will reduce the amount of work needed should it become necessary to change the data type later.
  • In Microsoft SQL Server, do not prefix stored procedures with sp_, because this prefix is reserved for identifying system-stored procedures.
  • In Transact-SQL, do not prefix variables with @@, which should be reserved for truly global variables such as @@IDENTITY.
  • Minimize the use of abbreviations. If abbreviations are used, be consistent in their use. An abbreviation should have only one meaning and likewise, each abbreviated word should have only one abbreviation. For example, if using min to abbreviate minimum, do so everywhere and do not later use it to abbreviate minute.
  • When naming functions, include a description of the value being returned, such as GetCurrentWindowName().
  • File and folder names, like procedure names, should accurately describe what purpose they serve.
  • Avoid reusing names for different elements, such as a routine called ProcessSales() and a variable called iProcessSales.
  • Avoid homonyms when naming elements to prevent confusion during code reviews, such as write and right.
  • When naming elements, avoid using commonly misspelled words. Also, be aware of differences that exist between American and British English, such as color/colour and check/cheque.
  • Avoid using typographical marks to identify data types, such as $ for strings or % for integers.
  • When it come to Comments, Software documentation exists in two forms, external and internal. External documentation is maintained outside of the source code, such as specifications, help files, and design documents. Internal documentation is composed of comments that developers write within the source code at development time.
  • One of the challenges of software documentation is ensuring that the comments are maintained and updated in parallel with the source code. Although properly commenting source code serves no purpose at run time, it is invaluable to a developer who must maintain a particularly intricate or cumbersome piece of software.
  • Following are recommended commenting techniques:
  • When modifying code, always keep the commenting around it up to date.
  • At the beginning of every routine, it is helpful to provide standard, boilerplate comments, indicating the routine's purpose, assumptions, and limitations. A boilerplate comment should be a brief introduction to understand why the routine exists and what it can do.
  • Avoid adding comments at the end of a line of code; end-line comments make code more difficult to read. However, end-line comments are appropriate when annotating variable declarations. In this case, align all end-line comments at a common tab stop.
  • Avoid using clutter comments, such as an entire line of asterisks. Instead, use white space to separate comments from code.
  • Avoid surrounding a block comment with a typographical frame. It may look attractive, but it is difficult to maintain.
  • Prior to deployment, remove all temporary or extraneous comments to avoid confusion during future maintenance work.
  • If you need comments to explain a complex section of code, examine the code to determine if you should rewrite it. If at all possible, do not document bad code—rewrite it. Although performance should not typically be sacrificed to make the code simpler for human consumption, a balance must be maintained between performance and maintainability.
  • Use complete sentences when writing comments. Comments should clarify the code, not add ambiguity.
  • Comment as you code, because most likely there won't be time to do it later. Also, should you get a chance to revisit code you've written, that which is obvious today probably won't be obvious six weeks from now.
  • Avoid the use of superfluous or inappropriate comments, such as humorous sidebar remarks.
  • Use comments to explain the intent of the code. They should not serve as inline translations of the code.
  • Comment anything that is not readily obvious in the code.
  • To prevent recurring problems, always use comments on bug fixes and work-around code, especially in a team environment.
  • Use comments on code that consists of loops and logic branches. These are key areas that will assist the reader when reading source code.
  • Separate comments from comment delimiters with white space. Doing so will make comments stand out and easier to locate when viewed without color clues.
  • Throughout the application, construct comments using a uniform style, with consistent punctuation and structure.
  • Despite the availability of external documentation, source code listings should be able to stand on their own because hard-copy documentation can be misplaced.
  • External documentation should consist of specifications, design documents, change requests, bug history, and the coding standard that was used.
  • Formatting makes the logical organization of the code stand out. Taking the time to ensure that the source code is formatted in a consistent, logical manner is helpful to yourself and to other developers who must decipher the source code.
Ref: http://msdn.microsoft.com/en-us/library/aa260844(v=vs.60).aspx Thanks: Rob Caron - Microsoft Corporation

Hope I shared something useful to you today and I'm going to end this post giving a tip from my experience to those who want to freelance work by quoting Edward V Berard  -
”Walking on water and developing software from a specification are easy if both are frozen.”

Saturday, August 31, 2013

How to keep me up-to-date with the latest technologies?

This is a million dollar question for most of the programmers. Programmers often live in virtual language specific world including myself and when we asked to go to another world, we get annoyed. When we spend years discovering a world and hear about a better one, it’s not a good feeling.

When I talk about keeping me up-to-date with the current technologies, I have to touch a subject called “programming paradigm”. It was interesting listening to Dr Evens’s lecture on “Programming Paradigms” and the stories about how computer languages evolved by time; was very fascinating. Let’s look at the definition of paradigm first, with the help of Google.

Paradigm: "A philosophical and theoretical framework of a scientific school or discipline within which theories, laws, and generalizations and the experiments performed in support of them are formulated; broadly: a philosophical or theoretical framework of any kind"

I have to tell something off topic here, in Virtusa we had an internal seminar organized by our training team and one of the highly experienced trainers, JJ, talked about Paradigm shift and how important that we/companies should cope with it. It has been a while since I attended the seminar and as I remember it, it’s one of the essential and fun things to learn that  the Swiss watchmakers had the paradigm that a watch was a mechanical device, i.e., to be a watch it had to have springs, gears, moving second, minute, and hour hands, etc. The end result was that this research was abandoned because it was not a “real” watch. However, they did put the research on display and when the Japanese companies like Seiko saw it their paradigm was “time keeping device” and they grabbed the digital watch concept and ran with it. The end result was that because of their inability to make a paradigm shift from a watch being a “mechanical device” to a “timekeeping electronic device” the Swiss watch industry almost collapsed because of the Japanese were able to make this paradigm shift. In the seminar then JJ went on to discuss how it is important for a business to know what paradigms it has, to understand them, and, most importantly, be constantly on the lookout for technologies or innovations that can cause a paradigm shift. Why? Because if you miss it you can be out of business.

Coming back to “Programming Paradigms”, first will look at the main paradigms in software industry especially on PP. The first thing I studied in Uni was about the History and the generations of Computer Programming Languages. If we were to skim through the main chapters, we can look through the main four generations with the help of Google. I’m at the moment working using a 4th generation Programming Language  - BPM Workflow manager , PRPC, which uses Java and Oracle in the core engine and enable users to code by just using flows and web based visual controls. Everything else are done in the background from Hibernate-like table class mapping to external system integration.

The first generation program language(1GL) is pure machine code, that is just ones and zeros. Programmers have to design their code by hand then transfer it to a computer by using a punch card, punch tape or flicking switches. There is no need to translate the code and it will run straight away. Code can be fast and efficient and can make use of specific processor features such as special registers, however, code cannot be ported to other systems and has to be rewritten and difficult to edit and update.

Second-generation programming languages(2GL) are a way of describing Assembly code. I have absolutely no idea how this works. Google says that it is done by using code resembling. Assembly code has similar benefits to writing in machine code, it is a one to one relationship after all. This means that assembly code is often used when writing low level fast code for specific hardware. Until recently machine code was used to program things such as mobile phones, but with the speed and performance of languages such as C being very close to Assembly, and with C's ability to talk to processor registers, Assembly's use is declining. Code can be fast, efficient,make use of specific processor features such as special registers and it is closer to plain English, it is easier to read and write when compared to machine code. Here also the code cannot be ported to other systems and has to be rewritten
For example:
ADD 12,8

Even though Assembly code is easier to read than machine code, it is still not straightforward to perform loops and conditionals and writing large programs can be a slow process creating a mish-mash of goto statements and jumps. Third-generation programming languages(3GL) brought many programmer-friendly features to code such as loops, conditionals, classes etc. This means that one line of third generation code can produce many lines of object (machine) code, saving a lot of time when writing programs.
Imperative languages - code is executed line by line, in a programmer defined sequence. Third generation (High Level Languages) codes are imperative. Imperative means that code is executed line by line, in sequence.
For example:
dim x as integer
x = 3
dim y as integer
y = 5
x = x + y
console.writeline(x)
Would output: 8

Third generation languages(3GL) can be platform independent, meaning that code written for one system will work on another. To convert a 3rd generation program into object code requires a Compiler or an Interpreter, Hardware independence, can be easily ported to other systems and processors and programmer friendly, one line of 3rd gen is the equivalent of many lines of 1st and 2nd gen, However, the code produced might not make the best use of processor specific features unlike 1st and 2nd gen.

Fourth-generation languages(4GL) are designed to reduce programming effort and the time it takes to develop software, resulting in a reduction in the cost of software development. They are not always successful in this task, sometimes resulting in inelegant and hard to maintain code. Languages have been designed with a specific purpose in mind and this might include languages to query databases (SQL), languages to make reports (Oracle Reports) and languages to construct user interface (XUL). An example of 4th generation programming type is the declarative language. An example of a Structured Query Language (SQL) to select criminal details from a database. Declarative languages - describe what computation should be performed and not how to perform it. Not imperative!
For example: EXTRACT ALL CUSTOMERS WHERE "PREVIOUS PURCHASES" TOTAL MORE THAN $1000

It gets more interesting than that, now we have a 5th generation concept and which is called 5GL. Fifth-Generation Programming Language (5GL) is a programming language based around solving problems using constraints given to the program, rather than using an algorithm written by a programmer. Most constraint-based and logic programming languages and some declarative languages are fifth-generation languages. Fifth-generation languages are used mainly in artificial intelligence research. Prolog, OPS5, and Mercury are the best known fifth-generation languages.

Let’s look at the big picture, the big-bang of languages:
big-bang of languages
big-bang of languages
Thanks: http://www.cse.chalmers.se/~bernardy/pp/Lectures.html#sec-1

These paradigm-shifts happen so fast in our industry more than in any other industry. Not only software or programming languages, but also hardware. When I was developing websites half a decade ago, I only had to worry about computers and screen resolutions. Now, we have mobiles, tablets, computers, many other screen dimensions and device capabilities to worry about. Devices and its capabilities are getting sophisticated every day and software industry also growing very fast trying to serve the devices well.

We, programmers, could learn a concept or programming language or a design pattern today and it might well be discarded tomorrow. If you disagree with me, ask about what happened to me have studied Macromedia/Adobe Flash. Those days I was crazy happy making websites using flash , now I don't even have flash installed in my computer.

So, how do we deal with this problem? To be honest, there are more than one questions associated with this question. Before we try to answer this question, we should ask some questions ourselves to get the context right. For example, what I exactly want to do? We could just say, I'm a programmer, but we can't be just coding in every programming language or be doing everything out there falls in the software programming category.  I believe, to succeed in our industry, it's vital that we should be specific about what we want to do while having the firm understanding of the fundamental concepts. We should choose very specific areas of our profession and should get certified and should know everything possible in that specific area. Choosing very specific areas to excel and succeed has its risk, yet I don't think there is anything we could do about it. We should just be willing to take the changes as we grow. As I already mentioned a million times in my blog, I'm now working in BPM steam using Pega tool and I know it's a big risk, if there would be a better Business Process Manger out there in the market tomorrow. So,outside my work hours, I try to keep me aware of the other things happening out there in the dark.

Also, I think, it's important that we should be absolutely clear that agile is turning into a mainstream methodology, and soon only a few extinct mammoths will do waterfall. Agile has won the race. Microsoft is now working to improve agile methodology support many of its products, they also do iterative development for many of their products. IBM has launched Jazz agile platform. Pega supports mainly that.

Software is not like any other product it is often compared to. It is fundamentally different from a car or a house.  Every project is different, even if only the team is different, so there is less predictability. The industry is small, fast-moving, and there is no complete well-known set of templates and methodologies that guarantee timely delivery of a wide variety of tasks – simply because many of the best methodologies, practices, and platforms and tools are a work in progress.

So, I think, including myself, we should just stop worrying about keeping us on the edge and just keeping doing what we love doing and not to ignore the major changes. To me, It's very important to be in every race than winning a race and backing off for the next one. I see successful people in the industry, they still only know BASIC or PASCAL language.

I could give you some pointers that I think might be useful for you. In the classical sense, if you like to keep you up-to-date on your industry, you should find ways to stay informed. Many of us work in changing competitive environments. If we don't keep up with news and trends, we can miss key opportunities and can be caught unawares. That's why, for some of us, it's important to keep-in-touch with news and trends in our industries. Although keeping up with industry news may seem to be just one more thing to add to your To-Do List, there are several important benefits. First, you'll make better decisions, and you'll spot threats and opportunities early on, which can give you a competitive edge.

So how do we stay informed to keep us up-to-date..?

  1. We should find a mentor. I have a few people, I look up to. A great starting point is to find a mentor within the place you work. Not only can mentors help you solve career issues and develop your career, they can provide you with a wealth of insider knowledge, as well as with the insight needed to understand it.
  2. Subscribing to some popular magazines those could help us be informed. Our industry may have one or more trade organizations that you can join. These are useful, because they can help to keep you informed with their newsletters and publications, and they provide networking opportunities with meetings and conferences.
  3. Seminars and conferences are great for learning about new technologies, new products, and industry trends; and they can provide ample networking opportunities.
  4. Having tech friends outside work can be one of the most rewarding ways to stay on top of industry news and trends. We could have a wide pool of people to network with. People directly related to our industry are an obvious choice, but so are industry related people, customers, and people working in related fields.
  5. Blogs aren't just for personal journaling anymore. Many bloggers are respected for their high quality work and honest opinion. Whatever I write happens to just be the solutions I find to the problems I face and I know my friend and readers could relate to them.
  6. Keep Google, Twitter, LinkedIn and tech forums in your pocket. Yeah I'm saying it's a must that you have a smart phone:)
  7. Making Time, Sharing and Using are the last and not definitely least tip I could think of to keep us up-to-date.

Thursday, August 15, 2013

What programming language should I choose to excel on and why?

The first software package I ever learned is Microsoft Excel in 1997 at my school, Jaffna Hindu College. Some of our old school union people thought that the young pupil in our school should learn computer. I’m grateful to my school and I should write about my schools in another post. Computer was a very alien idea at that time to me. Probably to most of them in Jaffna. At school they plugged the computers up and showed us as an exhibit first. The Pentium D computers had Windows 95 as I remember. After months they let us touch it and play with it, that we would go in there and with instructions, we would left click on the start and go to programs > accessories and open word pad to type our names. We did this for couple of months once a week for a class period after lunch break on every Friday. It's very exciting, not having electricity at home and to experience this miracle machine for about 40 minutes every week.

In 1998, Thanks to Dugles Devanana, a politician at that time in Jaffna, had an institute opened to study computer called ‘IT Park’ and I joined with my parents support to Study Microsoft Excel. Ever since I clicked on the ‘Start’ button, everything excites me when it comes to computer. Everything’s still an absolute magic and as intact nothing understandable. Then over the cause of last 15 years, I have learnt number of programming languages. The main ones are PHP, Flash Action Scripts, ASP, JAVA and .NET. It’s really a headache to decide as to which one to go for when I start a new project.

I spent my early tech life praising php. It is still a great language for many specific type of web development. Easy to learn, easy to use, free, widely used, most hostings support, simple and sweet. Hosting applications on low budget or deploying /changing the hosting location is extremely easy and I never had any issues deploying. However, PHP is not great at scaling in terms of programming. The main problem with PHP isn't that it's not scalable. The problem is that the majority of PHP coders don't have a clue about OOP, design patterns, coding standards and simply don't know how to write scalable code although it's perfectly feasible in PHP.

For small applications, though, J2EE and .NET can really be overkill. In Java, a lot of time needs to be spent configuring and tuning Hibernate, struts-config, etc, so simple CRUD applications are usually done best in PHP.

So, it would be unfair to compare PHP with Java or .Net. PHP is best to develop simple sites. I think, we should only compare Java and .NET due to the similarity and the capabilities.

Both multi-tiered, similar computing technologies, both support “standards”, both offer different tools & ways to achieve the same goal. A lot of parallelism can be seen. Very difficult to compare and qualify the comparison because each has its own advantages & disadvantages.

So, when I think about Java,
  1. Truly platform independent.
  2. Free(very much) and Open Source (very little).
  3. Loads of libraries and APIs available.
  4. According the Java Update Advert, more than 3 billion devices use Java.
  5. Very secure and stable, but comparatively slow.
  6. True object oriented.
  7. Methods are virtual by default and static imports available.
  8. Instance-level inner classes and interface for enums.
  9. As far as I see, more job opportunities.
  10. Many major applications are written in Java. (For example, I’m currently working on Pega BPM suit and it’s extremely sophisticated and purely written in JAVA.)
  11. Easy integration to new devices without the need to have windows.
And .NET (C# mainly)
  1. No automatic fall-through from one case block to the next.
  2. Strongly-typed enums.
  3. By reference calls are explicit at caller AND callee.
  4. Method overrides are explicit.
  5. Supports versioning.
  6. Structs (value types).
  7. Integrated support for properties and events.
  8. Can still use pointers with RAD language.
  9. Can share data and use functionality with components written in many different languages.
  10. Unsigned integers.
  11. High precision decimal number.
  12. Complex numbers.
  13. Value types.
  14. Lifted (nullable) types.
  15. Tuples.
  16. Pointers.
  17. Instance-level inner classes.
  18. Statement-level (local) anonymous classes.
  19. Enums can implement interfaces.
  20. Object initializers & Collection initializers.
  21. Explicit interface implementation.
  22. Reference (input/output) parameters & Output (output) parameters.
  23. Runtime realization.
  24. Value/primitive type constraint.
  25. Constructor constraint.
  26. Primitive/value type support.
  27. Method references.
  28. Closures.
  29. Lambda expressions.
  30. Expression trees.
  31. Generic query language.
  32. Late-bound (dynamic) type.
  33. Runtime generics realization.

I feel lucky to have chosen this career path that I often get to have fun coding and doing many fun things, yet there is one thing is really annoying. New immature technologies quickly be able to gain popularity and kill giant technologies or treads. We spend learning a language taking years and by the time we become competent, there would be a new and better programing language getting attention. I have been coding in PHP, Java and in C# the last decade and the fairly new languages ROR and GO makes me nervous.

Just to write this blog post, I was reading about Go lang and Ruby on Rails. As far as I read, it’s a bit tough to write something sensible on Go with my knowledge. I understand that it’s an improved C and not a pure object oriented language, more of procedure language. Google initiated and developing to handle it’s “Big Problems”. I don’t see any big company using other than Google and the online resources and learning materials are limited.

On the other hand, ROR is now becoming extremely popular and I see why. I really want to learn ROR for many good reasons. Ruby is a programming language, and Rails is an application framework that uses Ruby. ROR lives by the principle that "convention over configuration" which is something I'm still struggling to understand. Rails is written in Ruby, which is a language explicitly designed with the goal of increasing programmer happiness. It is very true.

Now about 2 to 3 hours I’m trying different different code techniques on ROR and it’s truly a joy coding. Please check the code below and if you could think of a C# or PHP or java version of it, you will understand what I’m talking about. I guess, you could really have fun coding once you started off with ROR.

describe Bowling do
before(:each) do
@bowling = Bowling.new
endit "should score 0 for gutter game" do
20.times { @bowling.hit(0) }
@bowling.score.should == 0
end
end
So to conclude the first question I had in my previous post, I’m going to say, programing language choice should really be about the project we are going to be working on considering the,
  1. Complexity.
  2. Scale.
  3. Type of project.
  4. Resources needed.
  5. Performance and security.
However, I would want to make myself really family with .NET to work on medium or large scale projects with enough budget and ROR to work on small and medium size projects with considerably low budget.

.NET to have ROR style of programing would be my dream.