Greetings, our dearest visitor :).
For some time now I get a lot of questions like:
“What kind of knowledge do I need to posses in order to start working at Enterwell?”
Dave Eloper, Jr.
“I have some programming knowledge that I learned at my college, but what do I need to do in order to level-up in the beautiful art of programming?”
Steward “Stew” Dent
So I decided to make a blog post that will hopefully help our young colleagues to gain skills that will get them jobs in our ever growing and most interesting IT industry. I assume that you know how to start your IDE and write a simple Hello World program at least. Also, I assume that you are ready for the challenge and that you can google everything from this tutorial that you want to know more about.
What do you aim to accomplish in life? To make creative things with technology? To solve some problems with the software that you wrote? To buy a beautiful car that was manufactured by the greatest car masters from Germany? To gain respect in your community? Something else, but equally cool?
Well, you can do all of that and more through the career of software developer. In this post I will write about what I think that you should master in order to start your journey towards becoming master backend developer.
Don’t think that this path is easy and that it requires anything less than your complete attention and devotion. With every challenge you will be at very edge of your possibilities and you will wish to quit. But, if you endure, with every completed challenge you will be generously rewarded and your programming skills and life quality will level up. Something like Pokemon game on Game Boy. We all know how much fun was that 🙂
First things first – basics
When it comes to programming, as with everything else in life, theoretical and practical knowledge are equally important. Always remember that. Please, don’t become one of those developers who say that they know and use everything, but they just don’t know the names for those things.
You must have theoretical knowledge. All of your system designs and development decisions must be based on firm theoretical grounds and on good practices from others. Also, when you’re in the pub with your mates, it’s very late and you need to talk about the tough subject, don’t talk about the politics, economy or philosophical subjects, you’re better than that. Talk about the theoretical concepts in programming and argue about the clean code and best practices. That’s the right way!
Also, don’t think for a moment that only theory will suffice. Practical knowledge, that you can only acquire by practicing and studying the best practices, must also be founding stone of your development skill set. If you go out and reinvent everything on your own, you will always be few steps behind someone who knows how to use best practices and where to implement something custom, new and innovative. Look at it in this way: if you want to achieve great heights, you can do that only by standing on the shoulders of the giants.
So, that’s it about those general stuff. Let’s get technical :).
When it comes to programming, very few things are simple, but I will try to simplify things here as much as possible. Keep that in mind because as you go trough tutorial, you will start to make connections and you will see that things are intertwined and a bit more complicated than I explained here :).
In this tutorial we will use programming language C# and .NET framework. We use these technologies in our everyday programming and we are very satisfied with their elegance and efficiency.
Paradigms, programming language and syntax
Paradigms are set of concepts or methods that define how to do stuff. First things that a new programmer must learn are paradigms. This is because you must train yourself to think as a programmer and to solve problems as a programmer. When you are faced with real world problem, you must be able to model that problem in a way that computer can understand. Only after doing that, you can command your computer to help you solve the problem at hand.
Paradigms are very important and they are the roots of your programming knowledge. When you familiarize yourself with common programming concepts and you learn to think in a way that computer can understand, then you will be able to become mediocre in any new programming language within a few weeks time. Yes, I think that you must invest lots of your time to understand common programming paradigms, and then you will be able to learn new programming languages within a couple of weeks.
The most popular paradigm in programming is Object oriented programming (OOP). OOP tells us to model our real-world scenarios and problems by using objects. This is similar to how human brain normally works and great masterminds of programming figured that it would be a good idea to model our computer systems in a same way. OOP lets us divide our problem in several more simple components that are responsible for very few things. When we let those components to communicate we can create a complex systems from simple components.
I think that paradigms are more important and that you can learn syntax in few weeks, but in order for you to use anything that you have learnt about paradigms you must know the syntax. Also, if you want to make anything that’s good with your syntax knowledge, you must know and respect the teachings from paradigms. You see, this is one of those things that are connected and not so simple :). Because of that, read the following several times so that you can make connections between them.
First, we should learn about the Object oriented programming. I suggest that you invest in yourself and pay for this course at Pluralsight: https://www.pluralsight.com/courses/object-oriented-programming-fundamentals-csharp.
If you don’t want to do that, then you go through following links and after that do a little bit of googling about OOP :). The links:
- Wikipedia article: https://en.wikipedia.org/wiki/Object-oriented_programming
- Youtube video: https://www.youtube.com/watch?v=lbXsrHGhBAU
After that, we should learn about the C# language and its main components. You should follow this link: https://msdn.microsoft.com/en-us/library/67ef8sbd.aspx.
Now, please, take some time and go over these links once again and understand them together.
Also, you should know about the SOLID principles. Here is the link: https://en.wikipedia.org/wiki/SOLID_(object-oriented_design).
The next thing that you must learn are patterns. The idea is that someone somewhere had the same problem as you do and they tried a bunch of things and in the end they chose the best solution that solved their problem and that was good with the rest of the system. That solution was smart and universal and it could be applied to numerous other situations. So programmers gave name to that kind of solution and it become a programming design pattern.
Once again, please don’t be that guy who reinvents the wheel (badly :)). Be that cool guy who uses the wisdom of others and builds great solutions on which the whole programming teams can work.
When it comes to patterns, you must know their names, what they do and when they are useful. You must be careful because sometimes pattern for one thing can be anti-pattern for the other thing. And always remember: “There is no silver bullet” (google it). Also, you may be wondering why you must know the names of the patterns. Well, imagine this situation: your colleague and you are designing some part of the system and you agree on one component. Your colleague tells you to implement the singleton pattern for that component. You must immediately know what singleton stands for and how to implement that pattern. If someone has to explain it to you, then they will be very sad.
You should start with following patterns. Some of them may be a bit older, but they are good starting point from which you can easily upgrade your knowledge.
- Singleton: https://en.wikipedia.org/wiki/Singleton_pattern
- Factory: http://www.tutorialspoint.com/design_pattern/factory_pattern.htm
- Repository: http://web.archive.org/web/20150404154203/https://www.remondo.net/repository-pattern-example-csharp/
- Facade: https://en.wikipedia.org/wiki/Facade_pattern
- MVC: https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller
- MVVM: https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel
Quite interesting, as you can see :).
Next in the queue are frameworks. Frameworks are programming components that enable you to easily do actions that are universal and repeatable between many projects. For example, to communicate with database you will use an ORM framework. You will never go and implement communication between your application and your database by yourself because it will take you a lot of time to do that and you will produce a components that no one uses and that are not upgradable.
The thing with frameworks is that they always add a little bit of overhead to your application. But you tolerate that because the gains from the good frameworks are much greater than the losses. Again, please, don’t go out and reinvent the wheel. Use the quality components that world’s greatest masterminds have given to all of us :).
So, by now, you must be thinking about what frameworks should you start learning and using. Here are some of them:
- .NET and ASP.NET: these frameworks are crucial if you want to do anything serious with C#. Don’t go online and learn everything about them immediately. Google them, and keep them in mind.
- Entity Framework: This is an ORM (Object-relational mapper). You will use it in order to communicate with your database. It eliminates the need to write most of data-access code that you would usually write in order to implement communication with database. Also, it will add a layer of abstraction between your application and your database: you will not need to think about the database much, you will just need to think about your program model. Also, if you wish to switch your application from MS SQL database to, lets say, PostgreSQL, you can do that pretty easily. You will never change you application layer code, just some configuration files. You will learn everything you need about the Entity Framework while working with Web API framework. But, if you need it, this is the link to everything EF related: https://msdn.microsoft.com/en-us/data/ee712907.
- Web API 2: this is Microsoft’s framework for making REST APIs. Before we continue, please familiarize yourself with following:
- REST API: these are set of rules that dictates how to make API that will be available over HTTP protocol. In short, people will be able to call your application from internet and you will communicate in more standardized and elegant way :). You should use google and learn what HTTP methods are used for what, how to name your routes, how to manage versioning, … Use the google, it’s pretty powerful tool :D.
- JSON: this is data format that is used for communication between the systems. When you have some data and you want to send that data outside of your application runtime to someone else, you will serialize your data string in JSON format, and then you will send that string to the other system. JSON is elegant, lightweight and fast. Please, use JSON instead of XML because it’s modern and we should be modern too :O.
- WEB API 2: so, at last we get to Web API 2. Everything that you need to know is in this tutorial series: http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api. Microsoft did a very good job here.
Let’s say that is enough for now :).
Well, what can I tell you about the best practices. As you could figure out by now, you shouldn’t reinvent the stuff that are already invented. Also, you will be working in team, or you will have to look at the code that you wrote three months ago and forgot all about it. In those situations you would like to look at your code and understand everything immediately. Also, if client wants something changed or something new, you would like to implement the changes as fast as possible without breaking any old code.
For the situations like that, you should be actively researching and using the best practices. You have some challenge, go online and search the best practices for that. For example, how to write, maintain and comment your code. Go online and search for that. Microsoft has the whole document about that and it is pretty great :).
I will be brief here, so google this one for more details 😉 When you are constructing some great building, you don’t do stuff by the feel. You make projects and plans. You make diagrams that clearly and without any room for a doubt describe the matter in hand. When someone wants to implement something new to that building, they don’t go on the site and study the building. They use diagrams and project plans in order to learn anything they want to know. After that they can be certain that their new work won’t break anything that was implemented before.
It’s the same with the software development. You will never go and implement something from the top of your head. You will write stuff down on the paper, you will see all aspects of the problem and provide the best solution. Diagrams can be made and upgraded really fast. Only when you are 100% satisfied with your diagrams, you start writing the code.
UML diagrams are special types of diagrams that software architects use to describe the system that will be built. Here are couple of nice diagram types:
- Use case diagrams,
- Class diagrams,
- Flow charts,
- Sequence diagrams,
As I said, google this one :). Also, you have pretty good stuff here: http://www.tutorialspoint.com/uml/index.htm.
Writing automated tests
This is the most crucial part. Many programmers write some piece of code and do manual tests. So, they continue like that, and all of the sudden, they have 100+ components. They want to write something new that changes the existing code base, and then come the problems. In order to test all things out, you need to do at least 100 manual test because you have 100 components. One manual test takes for example 30 seconds to make. You see the problem here: they will be doing manual tests for 50 minutes. If we go to real world example where you have 1000+ components the problem is pretty serious.
We are programmers. Our job is to automate things and to replace ourselves with scripts and code :). Pretty good thing is that we have unit tests. We test every component with assumption that the other components on which our testing component depends are working well. By doing that kind of test we can test every component separately and be pretty sure that there will be no errors.
“Testing shows the presence, not the absence of bugs.”
This is a vast subject and we all discover its mysteries through practice and hard work. But, you must check this presentation by Damir Svrtan of Infinum: the link.
Just one more thing
I listed a couple of things about the programming that I think that you should know. But, apart from technical knowledge, you must work in team. You must be a good team player, you must listen and be open to ideas.
Also, maybe you don’t know anything in this list. That’s alright. No one is born with the knowledge. But you must show the will to learn fast, test concepts and adapt. You should be able to admit your mistakes and implement someone else’s ideas if they are better.
Most important of all, you must be open to new ideas and new technologies. Don’t exclude anything. Sure, some stuff are old, some are boring, some are too new and not stable enough. But, everything is there for a reason and we can learn from it. If you act like a fanboy and don’t give a chance to new and different technologies, then you are playing a losing game as a programmer.
If you know everything from the list, then please contact us and we will begin to work together very soon 😉
If you know some of the things, but you heard about the other things, then this is your chance. You have explanations and links to read more. Educate yourself and then contact us.
If you are new to all of this, please, give it a chance. Only you are responsible for your future and no one owes you anything and no one will tell what exactly to do and how to succeed. You have the explanations, you have links, you have a will to learn. Start right now.
Get yourself familiar with the things that I wrote about in this post and your fabulous life of computer programmer can start.
In any case, do check our careers page and send us an email when you’re ready 🙂
And now really the last thing in this post: a quote from a very smart and humble man, our dearest Mr. Dijkstra:
“The art of programming is the art of organizing complexity, of mastering multitude and avoiding its bastard chaos as effectively as possible.”
Stay good and do no harm 🙂