8 Things every new programmer needs to learn

1. Programming language. This is kind of obvious but you have to learn a programming language to be a programmer. This chapter will discuss the different languages and their pros and cons. Should you learn an object oriented based language, procedural language, or a scripting language? Should you learn a compiled or interpretive language? Should it be strongly typed or loosely typed? These all depend on the types of development and applications that you will be building. Are you going to be a game developer, enterprise application developer, or mobile app creator?

2. Language basics. Every language has the same basics. It has data types(a type system), branching, looping, boolean expressions, arithmatic expressions, and reusable blocks of code you build(methods, functions, classes, etc).

3. IDE. Integrated Development Environment. This is the tool that you will program with. Do you need a full IDE with debugger and other tools, or will a text editor suffice. But either way you have to become a comfortable and proficient with an IDE to be a real programmer. The IDE is your best friend. This is what makes or breaks your productivity and frustration level.

4. Database. It is very hard these days to be a developer and not store or retrieve data. To be a real developer you will need to learn database basics. You don’t have to be a dba but you will need to know how to build a simple database and get and put data into it. The big question here is to learn a SQL or no SQL database. There are many good options of each. SQL database like SQL Server, Oracle, and MySQL are structured with tables, rows, and columns. No SQL databases like MongoDB and DocumentDb typically store data items as documents in JSON format. SQL has historically been the most used but No SQL databases are becoming very popular.

5. Framework. A framework is typically made up of 2 things. Reusable code(objects, libraries, packages, etc.) so you don’t have to build everything from scratch. And an environment that you code will run in. If you are a C# programmer, for instance, the .NET framework is what you will use. If you are a Java programmer you will use frameworks like Swing and the JVM(java virtual machine) to run your code. If you are a web developer you might use the Angular framework on the client and Node and NPM(Node package manager) on the server side.

6. Software design techniques. You will need to learn things like object oriented design, wireframing, use cases, flowcharting, and test driven design. These are all the techniques that you will have in your toolbox to allow you to take a set of requirements and turn them into a working application that solves a problem. This is how you take a concept and break it down into pieces of code that you can actually write.

7. Design patterns. These are common ways to solve problems with software. A common way to tackle a problem. For instances, many graphical user interface applications use the MVC(model-view-controller) design pattern. Others use the MVVM(model-view-viewmodel) design pattern. Another common design pattern is object oriented. You build a set of software objects that model real world objects. OO can also be described as a software design. Pipelining is a common design pattern for developing multithreaded and parallel applications. Design patterns will be you go to way of solving certain types of problems or building certain kinds of applications.

8. Software Development Lifecycles. SDLC’s are ways you manage the the life of a software project. This typically includes the following steps - gathering requirements, software design, coding, testing, deploying, and maintaining. Here will learn the classic waterfall method and newer methods like Agile and Scrum. But the SDLC is how you manage the whole project and life of a software system that you are building.

Old Dogs, New Tricks for a Software Developer

Recently, I switched companies and find myself having to learn a whole new way of developing. I had spent the last 6 years at a complete Windows/.NET shop. Everything was C#, Windows servers, SQL Server dbs, Visual Studio, TFS, the Windows/.NET life. It was a very homogeneous architecture, and all the developers were C# experts.

At my new company, even though I was recruited for my C#/.NET expertise, I found myself being handed a Mac for my development machine and a whole different world. They use mainly linux servers. I found out that .NET is really only used for a few .NET core api’s running on linux(arrgghh). They have a complete mismatch of platforms/languages/architectures. It is a lot of php, node js, python, and go on the backend, and almost every frontend you can think of(angular, django/python, vue, react, straight html, etc.). They are completely AWS cloud. All of the developers live in the bash terminal window with some sort of code editor(vs code, sublime, atom, etc.) instead of a full blown ide.

My new development team could not believe that anyone would not develop on a mac. They have this belief that full blown ide’s are overly complex and a terminal window, code editor, and console print statements are the best way to debug. Not to be an elitist programmer, this seems fine for simple stuff, but a complex multithreaded application needs more than console log statements to debug.
Well, this was quite a change for me, but I had made the switch because I was getting bored, wanted to learn new things, and see what an enterprise web shop with a bunch of youngsters was like. Little did I know how much learning I would be doing. May be it is a mid life crisis, who knows. I did grow a beard for the first time and get a tattoo. I am beginning to feel cool and hip again.
Now to the point of the article, my observations, on the pros/cons of these 2 very different environments and architectures.

The Mac as a development machine. I like it. I find myself hating to admit it but a mac is a pretty sweet machine. I do have Parallels and a Windows 10 vm for those days when I want to do some hard core C# stuff, but I find myself living more and more on the mac in a terminal window and vs code.

Speaking of the terminal window. This is kind of full circle for me. I started on a vax/vms terminal and some unix boxes back in the early nineties. I like the intimate nature of the terminal window and being closer to the os. That said I am still a fan of nice tools that handle lower level stuff for you. The geek in me likes the terminal window. The proficient experienced developer in me likes a good set of tools to handle lower level stuff.

Code editors versus a full blown ide. For node, python, php, and simplier things I am starting to like vs code. I have settled on it over sublime and atom. Maybe it is my visual studio roots but I do like it better. I can do some basic debugging in it, and it integrates well with git. But nothing beats a full blown ide for serious development. In my opinion, the full Visual Studio experience is hard to beat. Its tool set is unmatched. I find most of the young developers I work with do not like its steep learning curve. They find it to complicated and do not want to invest the time to become proficient with it. I think this is a little short sited, but most of what they are doing are projects that do not require visual studio. Creating an api that queries a db and returns some json data is not rocket science. Also, since it is mostly a mixed environment and linux based a lot of visual studio’s benefit are diminished. But in a plug to Microsoft and Visual Studio they have been adding a lot to their linux tooling.

Many languages. I have never been in such a schizophrenic environment. It is flavor of the day on steroids. To their defense some of this is due to acquisitions. The pro of this is it allows a lot of freedom and the choice to use a language best suited for a particular task. The con of this is that there is a ton of technical debt, and everyone becomes a master of all and an expert of none. I find this the biggest downside. Everyone is what I would call a hack at a bunch of languages but not a master of any. There is a benefit to being an expert in the language and platform you develop in. You know the best practices, best design patterns, latest features and trends, etc. I believe you develop cleaner more easily maintained and scalable code this way. To me this is the biggest downside I see to my new environment. But from a learning new things standpoint, it is nice to get to play in a lot of languages instead of only C# everyday.

In summary, I think somewhere in the middle of these 2 environments is probably the best of both worlds. Selfishly, it has been great to get the learning and exposure to all of these languages, platforms, and trends. But if it was my company I would definitely drive to some sort of defined architecture.
I am surprised how much I like the mac, terminal window, and vs code. It is a nice tool set for small tasks.

I look forward to more learning and growing. Never get too bias or stuck in your platform of expertise to not try new things with an open mind. I try to live by this in life and software development.

Zen and the Art of Programming

zen

As a teacher of programming, I come across a lot of new developers that are just like I was earlier in my career. They see software projects as finite things. Something to be built and finished. There are deadlines. There are so many more projects. This mindset leads to a lot of stress and an overwhelmed feeling. How can I get all of the functionality built? It is going to take forever, and I just spent 3 hours on a simple bug that should have taken 5 minutes.

Relax. Software programs are not a finite thing you build and finish. They are more like a living organism that grows and changes over time. They are never done growing, and unlike a real living being, they rarely die. I have software I wrote over 20 years ago still in production. Think of Microsoft Word. A word processing program that has been around since the 80’s. The first version came out in 1983. It is still growing and evolving. Microsoft still releases new versions.

When you view a software system as a living being that grows and evolves it changes your whole mindset. It is not about completing the project. It is about finishing this phase. What doesn’t make phase 1 can come in phase 2. On a side note, you see this evolution in the Software development lifecycle models. The industry used to use the classic Waterfall method. You gather all of the requirements, build every possible feature and then release the product. Done. Finish. Well this didn’t work so well so the industry moved to Agile, where you are never finished. You just release new features every couple weeks. To now, Devops. Where you continuously build, test, and deploy. It is the industry progression of viewing software as a finite object that is built to a living organism that is fed and maintained on a daily basis.

As a developer the sooner you get to this mindset the better. I find it much more relaxing and sustainable. No longer do you need to stress about getting all of the features built and finished. You just focus on today and what feature you want to add today. Each day you make the system better. One day at a time. Progress not perfection. Everyday when you go home you know you software system is better than the day before. Next thing you know, you look back a few months later and it is amazing how many features and pieces of functionality have been added. It is also amazing, given the constant changes in technology and business, how many new features you need to add. All in due time. One day at a time.

I recently taught a beginner C# class. It was 4 weeks long on Tuesday and Thursday nights for 3 hours with one Saturday. I told the students the first night that we would build a full functioning card game application that could play Blackjack, Poker, and War by the end of the class and it would include multiple players and games and remember a players game history. They thought I was kidding. They thought it a noble effort but not something we could actually do. After all they were new to programming and C#. But each day we bit off a new piece of the pie and slower but surely we whittled away. I told them all along not to focus on the whole effort or all the things we needed to do. Each night just focus on the piece we were doing that night. I even told them that maybe we won’t finish it. Maybe it isn’t reasonable. Who cares if we finish. It’s the journey not the destination. Enjoy the ride. Have fun. Focus on just what we need to do today. If we don’t finish today we’ll finish the next class. No worries. But in the end we did finish at least the initial functionality of the games(Remember programs are never finished. We can always add more to it). And they did enjoy it. They weren’t overwhelmed and stressed by the effort. They enjoyed the journey knowing that if we didn’t finish tonight we would at least make it better tonight. They left the class with a working program but also many more changes they can build to continuously grow and evolve the system.

Since I started viewing software as a living system that grows and evolves everyday. I have learned to enjoy the art of programming much more. Everyday is spent teaching, growing, and learning as I evolve along with the system I am building. It is a journey we are traveling together.

Check out the UWP Community Toolkit

Check out the UWP Community toolkit on github. This toolkit will increase the productivity of all UWP developers.

It has tools divied up into 5 different categories(Controls, Notifications, Animations, Services, and Helpers), This toolkit has all sorts of goodies to help speed up your UWP project.

As .NET developers transition their skills to UWP this toolkit will jump start your projects with eliminate a lot of your initial programming.

 

Clemson wins! Clemson wins!

I have to give a BIG shout out to my Clemson Tigers and their National Championship victory last night. Go Tigers. It is a good day to be a tiger AND a software developer :) .

I’d also like to promote our C#/.NET programming track at CPCC as an alternative to some of the popular code camps. We offer a 3 class track(Software Development Fundamentals, Beginning OO programming with C#, and .NET framework). These 3 classes are a great(and a lot more inexpensive choice) versus a standard coding boot camp. Check from out here C#/.NET programming track.

Also, you can signup for our newsletter to receive the latest tips for beginner programmers.

[mc4wp_form id=”61”]

Learning to enjoy programming - when you are stuck on a bug you think you will never solve.

As I teach new programming students, I inevitably see frustration in trying to figure out why their program will not build. What this syntax error really means. They get increasingly frustrated and dejected at the possibility of becoming a programmer. To anyone who is a programmer you know this feeling all too well. It is part of the job: the hours that can be spent on a single problem. The hopelessness of never being able to figure out what this error message really means.

But when you learn to love programming these moments become different. To quote a few passages from my spirituality studies, “it’s the journey not the destination”, “this too shall pass”. Programming is an art to be savored not completed. Not that completing a project is not important, but take these opportunities to learn an hone your craft. When you start to see them as learning opportunities instead of wasted time your outlook will change completely. It is not hours wasted on a program that should take 5 minutes. It is a chance to better your debugging skills, to learn more about your ide and how to troubleshoot with it, to learn shortcuts and more efficient techniques. Then the hours are not so frustrating as long as you keep in mind that “this too shall pass”. You will figure out what your bug is and along the way enhance your skills and become a better programming.

We all too often focus on the goal instead of the journey. Approach the problem with an open mind not a singular purpose of solving the problem in the shortest amount of time. Like everything in life it is all in your mindset and expectations that dictate your attitude. This is true in life and in programming.

Take a step back and enjoy the process. You will figure out the problem and learn a few things along the way that will make you a better programmer. And if nothing else, you will have a good war story to tell.

Software Development Fundamentals

I was putting together the outline for another book that I am working on called Software Development Fundamentals. It is intended to be an introduction to the world of software development. More than focusing on a specific language or methodology, it is intended to detail the different things someone would need to learn to become a skilled software developer. Let’s look at the 9 items I have come up with.

1. Programming language. Well, this is kind of obvious but you have to learn a programming language to be a programmer. This chapter will discuss the different languages and their pros and cons. Should you learn an object oriented based language, procedural language, or a scripting language? Should you learn a compiled or interpretive language? Should it be strongly typed or loosely typed? These all depend on the types of development and applications that you will be building. Are you going to be a game developer, enterprise application developer, or mobile app creator?

Every language has the same basics. It has data types(a type system), branching, looping, boolean expressions, arithmatic expressions, and reusable blocks of code you build(methods, functions, classes, etc).

2. IDE. Integrated Development Environment. This is the tool that you will program with. Do you need a full IDE with debugger and other tools, or will a text editor suffice. But either way you have to become a comfortable and proficient with an IDE to be a real programmer. The IDE is your best friend. This is what makes or breaks your productivity and frustration level.

3. Database. It is very hard these days to be a developer and not store or retrieve data. To be a real developer you will need to learn database basics. You don’t have to be a dba but you will need to know how to build a simple database and get and put data into it. The big question here is to learn a SQL or no SQL database. There are many good options of each. SQL database like SQL Server, Oracle, and MySQL are structured with tables, rows, and columns. No SQL databases like MongoDB and DocumentDb typically store data items as documents in JSON format. SQL has historically been the most used but No SQL databases are becoming very popular.

4. Framework. A framework is typically made up of 2 things. Reusable code(objects, libraries, packages, etc.) so you don’t have to build everything from scratch. And an environment that you code will run in. If you are a C# programmer, for instance, the .NET framework is what you will use. If you are a Java programmer you will use frameworks like Swing and the JVM(java virtual machine) to run your code. If you are a web developer you might use the Angular framework on the client and Node and NPM(Node package manager) on the server side.

5. Software design techniques. You will need to learn things like object oriented design, wireframing, use cases, flowcharting, and test driven design. These are all the techniques that you will have in your toolbox to allow you to take a set of requirements and turn them into a working application that solves a problem. This is how you take a concept and break it down into pieces of code that you can actually write.

6. Design patterns. These are common ways to solve problems with software. A common way to tackle a problem. For instances, many graphical user interface applications use the MVC(model-view-controller) design pattern. Others use the MVVM(model-view-viewmodel) design pattern. Another common design pattern is object oriented. You build a set of software objects that model real world objects. OO can also be described as a software design. Pipelining is a common design pattern for developing multithreaded and parallel applications. Design patterns will be you go to way of solving certain types of problems or building certain kinds of applications.

7. Software Development Lifecycles. SDLC’s are ways you manage the the life of a software project. This typically includes the following steps - gathering requirements, software design, coding, testing, deploying, and maintaining. Here will learn the classic waterfall method and newer methods like Agile and Scrum. But the SDLC is how you manage the whole project and life of a software system that you are building.

What do you think? Did I leave anything out? I believe if you focus on learning picking an item in each of these 7 categories you will be well on your way to being a successful developer. Like for instance, if you learn C#(1), Visual Studio(2), SQL(3), .NET(4), wireframing/flowcharting/oo design(5), MVC(6), and Agile(7) you will be able to call yourself a skilled C#/.NET application developer.

What are you waiting for.

Develop cross platform mobile apps - free workshop

There are a set of free 1 day workshops that walk you through developing a cross platform mobile app for iOS, Android, and Windows using .NET/Visual Studio with Xamarin. These workshops are around the globe. During the course of the day you develop your own cloud based app to run on all 3 platforms.

I will be attending the one in Raleigh, NC on October first.

If you are an aspiring developer or new to programming this is an excellent opportunity for a day of hands on learning with a real working example to walk away with.

You have to program to be a programmer!