English as a second language
Knowing where to start with any blog, for me, is always the hardest part. How does anyone put 20 years of knowledge, 20 years of influence from others, 20 years of personal interest into one blog? We are often told, we need to be succinct, and I personally find that when I am developing software, it is simple to be succinct, yet when I have to write English or explain a topic, things are not so simple. I joke that English is my second language, because I seem to find coding easier and more enjoyable and over the years I seem to have become quite a competent coder. But coding is just a means to an end.
Current Programming Languages
Right now, in my current job our coding languages include (in order of most used to least used)
- T SQL
- VB Dot NET
- HTML / XML / CSS
- VBA (say for Macros to complete advanced actions within Excel, Outlook or (gasp) Access when requested).
Why do we (notice I said ‘we’ not ‘I’ at that point of the sentence?) use these languages at work and not ‘other more impressive languages’ I hear you ask. Because I am a Team player who works with the inheritance provided by the Team that I join. In this team those are the Languages of choice, they are the Languages the Team understands and if one individual is away from work, the others can still modify code as required. If I were working in ‘your’ company, and I was informed that the company uses Ada (a 35 year old program) and nothing else, then I too would use Ada (in the workplace) and nothing else.
Source Control, Code Sharing / Repository, Collaboration Platform, Version Control, Cloud Backup
I have implemented many backup strategies over the years, most I should not tell you, as you would probably gasp! Ranging from Microsoft SourceSafe (you did not hear this from me), Team Foundation Server, GitHub, DropBox, USB Stick, Tortoisesvn. Some of these I dislike (SafeSource, TortoiseSVN) and some I have come to like (Dropbox, GitHub, TFS). However each option has it’s own benefit depending on the situation, scenario and degree of security required.
Which Security is the Right Security?
I have been amazed at most of the companies I work for have implemented the same level of security over every document. For instance, do you really need Super Duper High Level Encryption and Access Rights to save today’s lunch menu? On the other hand, should the CEO’s documentation on the future of the company be stored on a low level no encryption USB stick. Organisations could benefit from using different levels of encryption depending on the requirements of the associated documentation. How? It (should) cost less to implement less encryption / Access rights while proportionally it (should) cost more to implement higher encryption / Access rights. All processes have an ongoing cost associated, it is a matter of how you can implement the processes correctly, not cheaply how cheaply can you implement a process.
To IDE or NOT to IDE. This should never be a question.
To that end I have probably used more IDE’s than I care to remember: My current main IDE is Visual Studios (loosing count of the versions now days), Primal Script (even purchasing my own copy several times to use at work, because for some reason work thought notepad was an acceptable IDE), Eclipse, NotePad2/++, JBuilder, JCreator (I liked this one and purchased it back around 2006 for home use) and probably a myriad of others. To be honest, whatever IDE was required to get the job done, I installed, tried, tested, learnt (anyone who says you don’t need to learn an IDE is NOT making good use of their IDE and they may as well use Notepad 2/++) and implemented. In some cases implemented for a team environment. Don’t get me wrong, Notepad2/++ are both GREAT tools now days, and I still use Notepad++ to edit SQL .Snippet files! I am planning on writing a post in the near future on how to make use of the Microsoft SQL Server Management Studio inbuilt Code Snippets Manager, which is actually a very good way to improve the entire Teams coding speed / accuracy.
Software Development Methodologies
Additional I have utilized several different implementation methodologies, Iterative, Waterfall, SCRUM, Lean, Agile, Pair Programming. To be fair, I never felt it was about which methodology that was implemented, it was the understanding about what the project was at the beginning and identifying individual employees strength and weaknesses so as to utilize each employees area of strength to successfully implement the project. Warning bells always sound (for me internally) when someone (either on the team or the team manager) says ‘Lets include this great new feature into the project’. Moving the goalposts mid project directly violates fundamental principles of product development, yet for some reason the Project Management generally keep the expectations on the original deadlines and project costs.
There are ‘Groups’ and there are ‘Teams’
All Teams are comprised of a group of individuals, however not all groups work as if they are a Team. Do you notice that I always refer to Team as a proper noun? To me nothing compares to a good Team. A group of individuals may be use the nomenclature ‘team’ but if they do not demonstrate the correct characteristics required to work as a Team, then they remain a group of individuals. If this doesn’t make sense to you, then I would presume you are not a Senior Developer, or that you have not yet had the pleasure of working with a Team. I have personally worked with teams and with Teams. If I had a choice, I would always choose to work in a Team, as I have worked in ‘teams’ that, were… disparate (I truly have no basis for comparison). Imagine, as a candidate for a job you attend a job interview and ask a question to the panel similar to: ‘Will the group I am going to be working with work as a Team?’. And to be honest, I would love to know ahead of time who the individuals are which I am going to be working for. But the true opinion of if groups of individuals work well as a Team will depend greatly on the colour of the glasses each member is wearing.
There are ‘Individuals’ and there are ‘People’ and then there are Weeds.
When I helped managed a fruit orchard in the Riverland back in the late ’90’s both people management and weed/pest management was important requirement to be successful. Sometime those two seemed to overlap (I say this in jest). It is true though that regardless of team structure, there is also the individuals you invariably end up working with. Those that you get along with, those that you tolerate. Those that want to learn new things [from you] and whom you take a keen interest in learning from them, and those who have no interest in learning anything new whatsoever. Many people find it easier to hide themselves in the computer (code) and ignore those who are ignorant, because, lets be honest, this is the easiest way out. But a good Team can not afford to ignore others. A good Team understands the strengths and weaknesses of each and every individual within the team and they each play to their strengths. Every time you ignore someone, you miss an opportunity to develop a good working relationship.
Developing Software Solutions
Don’t get me wrong. I love to code. But I do not write 20 lines of code just for the fun of it. If I can write one line of code (instead of 20) I will. On the other hand, if 3 lines of code makes the code more readable, I will write 3 lines instead of 1. Code is a means to an end. For this reason I approve of Code Review within the team. I highly recommend that no code should ever be ratified and / or used until code has been through code review AND that it has been ratified and approved by xxx [I write xxx as this could differ depending on your scenario, implementation, security issues etc]. (I deal with my ideas of Code Review further down).
Before writing a single line of code, I want to know WHAT the end product is going to be. I need to know how my snippet of code is going to play a positive role in the overall project. If my section of code is not going to be used, then why write it? Furthermore, I personally aim to write code as if someone else on the team is going to be implementing it, yet I admit that I have seen some ‘functions’ and ‘classes’ (ie grouping code into bite size explainable pieces) are often highly over engineered and have no business flexibility. To that end I have seen poorly written code perform exactly what it needed to do without ‘error’ (or should I say, without apparent error!) for years on end, and I have seen well written code fail after just a ‘few weeks of use’ (I assume coders will understand that time isn’t really the object of the sentence here). In essence, I can’t really explain the reason for either, and those of you who say you can explain it, I will assume you are ‘young’ in terms of coding. If you have spent less than 15 years in coding, I will assume you are ‘young’.
One of my favorite things is to sit back and watch someone else offer up opinions on how I can improve my code. I have strengths in coding, I have weaknesses in coding and I have a human brain that doesn’t always see the optimum solution. Let me give you a very simple piece of Pseudocode, created by me, with the Code Review provided by a friend: (NB: Code has been vastly simplified, as the demonstration here is not actual code, but the simplification).
Function Numeric2Bytes(ByVal b As Double)
Dim i As Integer
For i = UBound(bSize) To 0 Step -1
If b >= (1024 ^ i) Then
Numeric2Bytes = b / (1024 ^ i)
Comment by friend:
You do realise your FOR Loop is an over complication of an integer approximation on a logarithmic pattern divisible by three?
Anyone who had studied The Big O in algorithm complexity & notation would have had the same response I did to my friends impeccable comment!
Oh – My – Gosh. I did not see that! How could I have missed it ?!?
7 Lines of code replace with just one, which is really more like (7 * x) lines of code replaced by one! TI had overlooked the simplistic.
Function Numeric2Bytes(ByVal b As Double)
Return Int(Math.Log10(b)) / 3) 'Because near enough IS good enough.
Here is the interesting part though. To me, this is simple to understand. This is elegant. This is what a computer is designed to do and the computer CPU will perform this single line of code FAST. Yet, to others (young coders) or to those who ‘don’t know how to code’, the single line of code is complicated and to them this line of code is far from the KISS principle.
Where to from here?
I have a long way to go. I hope. I hope to keep learning. To change and adapt to the business requirements. To learn simpler techniques that allow me to produce higher quality work with shorter turnaround times. To learn how to work with my Team in ways that make all of us produce higher quality work.
And we continue like this.
One Character at a time.
One Sentence at a time.
One Function at a time.
One Day at a time.
And so forth.
See you at the end.