My last Pluralsight course for this year is out!
I started out this year with the goal of creating 30 Pluralsight courses, this Beginning Lua course represents the completion of that goal.
It definitely feels great to accomplish what I had planned, even though the process may have been a bit painful at times. This is definitely the biggest single undertaking I’ve ever accomplished in my career.
Here is the official course description:
Lua is an extremely versatile and popular programming language that you’ll find embedded in many other applications like Adobe’s Lightroom or even World of Warcraft. Many developers are surprised to find that even very popular games like Angry Birds are written in Lua.
In this course, you’ll learn how to quickly get started writing programs and scripts with Lua. I’ll take you through the basics of Lua, show you some tricks that demonstrate the Lua’s flexibility and even show you how to use Lua in an object oriented way.
We’ll start off in this course by learning a bit about Lua itself and Lua’s history, as well as learn how to download Lua and use the popular SciTE IDE for creating and running Lua code.
After we are setup and ready to develop some Lua code, we’ll learn the basics of Lua as we jump right in and build our first application. We’ll go over Lua’s type system and learn how to assign variables, utilize operators, use conditional logic and create loops.
Once we’ve got the basics covered, we’ll explore two powerful concepts in Lua: functions and tables. We’ll learn how functions work in Lua and what makes them so powerful, and we’ll see how tables can be used for more than just storing simple data.
Even though Lua itself doesn’t have a class construct, we’ll learn how to do object oriented programming in Lua using tables and metatables.
Finally, we’ll wrap up the course by learning a little bit about the standard libraries that come with Lua. I’ll show you some examples of using some of the most useful functions in the standard libraries and show you where you can get more information about them.
I often get asked by beginner programmers what programming language they should learn.
This, of course, is a tough question to answer. There are so many different programming languages today that a new developer, or even a seasoned developer, wishing to retool his or her career, could learn.
I’ve actually tried to answer this question before in a YouTube video, but I want to revise and refine my answer a bit here, because some of my views have changed and I’d like to give a bit more detail as well.
The wrong question to begin with
It turns out that what programming language you choose to learn is not actually all that important
Things have changed quite a bit from back when I first started my career in software development. Back when I first started out, there were much fewer choices of programming languages and there were much fewer resources available for reference. As a result, the choice was much more important.
For example, I started out learning C and then C++. At that time, it took quite a bit of work to master the language itself and to understand all of the standard libraries that were available. A good C or C++ programmer back then had a very in-depth understanding of every nook and cranny of the language and they needed this knowledge, because of two main reasons.
- References were not as widely available, so figuring out a syntax or library available involved flipping through a huge book, rather than just typing some keywords into Google.
- Programming, in general, was done at a much lower level. There were far fewer libraries available to be able to work at higher levels, so we spent more time working with the language itself and less time working with APIs.
Contrast that with the programming environment of today, where not only is information widely available and can be accessed with ease, but also there are a large number of programming languages that we effectively use to program at a much higher level due to the vast amount of libraries and reusable components available to us today.
In today’s programming environment, you tend to not need to dive as deeply into a language to be effective with it. Sure, you can still become an expert in a particular programming language, and it is good to have some amount of depth in at least one language, but you can literally learn a new language in less than a week and be effective with it almost immediately.
Now, before your alarm bells go off and you write me off as crazy, let me explain that last sentence in a bit more detail.
What do you mean you can learn a programming language in a week?
What I mean by this is that once you understand the basic programming constructs available in just about all programming languages, things like conditionals, loops and how to use variables and methods, you can take that same knowledge to a different programming language and just learn how to do those same things in that language’s syntax. In fact, most IDEs today will even help you with the syntax part, making your job even easier.
If you are already fluent in multiple programming languages, you probably agree with what I am saying, but if you have only ever learned one programming language or none at all and are looking to learn your first programming language, you might be a little skeptical. But, take it from someone who has learned and taught programming languages which I have learned in a week, the basics are pretty much the same.
Check out this book which basically deals with this exact subject, Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages.
Now, if you are just starting out, it is pretty unlikely you’ll be able to learn a whole programming language in a week. This brings us to the question, you may be asking yourself…
So, what programming language should I learn then?
Hold up. I’m still not quite going to answer that question. Because, it still isn’t quite the right question.
Instead of getting hung up on what programming language you want to learn, you should instead ponder what you want to do.
Learning by doing is the most effective way to learn, especially if you are doing something you have an interest in or is fun to you.
So, I always start new want-to-be developer out by asking them what they want to build.
Do you want to build an Android application? How about an iOS application? A web page? A game?
First, figure out the answer to this question and then let that answer guide you to choose the technology and programming language you will use to achieve that goal.
Don’t worry so much about which programming language or technology is most valuable. You can’t make a wrong decision and regret it later, because it won’t take you much time to retool later if you need to. Once you have the basics down and have actually used a programming language to build something, you’ll find that doing it again will be much easier.
I like to encourage new developers to write a mobile application—especially an Android application.
Here are some reasons why:
- A complete Android application can be built by a single person. Creating a complete application will really help you to feel confident about software development and is one of the best ways to really learn to code. I spent a good deal of my early career only being able to create bits and pieces of things, and it was frustrating, because I never knew if I could really “code.”
- By learning Android, you learn Java and how to use libraries and APIs. This will give you a good programming language to start with and you’ll get some valuable experience with APIs.
- Google gives you some free help and makes things pretty easy to learn. Since Google really wants you to create Android applications, they have put quite a bit of work into creating easy to use tools and tutorials to help you be successful quickly. (I’ve also created some tutorials, which you can watch at Pluralsight here as well.)
- You can actually make money while learning and teach yourself a very valuable and upcoming skillset. Not only can you sell your Android application or monetize it in some other way, but you will be learning a complete set of software development skills for a platform that is in very high demand.
Aha! So Java it is then?
No, not exactly.
Summing it up
I’m actually working on some products to help developers manage their careers and lives better which will cover topics like this one a bit more in-depth. If you are interested in receiving some updates when I publish an interesting article or video, or when I launch some of those products, feel free to sign up here. Don’t worry, I won’t spam you. J
Fitting for this holiday, in this episode Iris and I talk about what you should do when you screw up.
I actually came up with the idea for this episode based on my own mini-screw-up in the last few weeks as I’ve been travelling and eating out a bit more than I should.
We all screw up from time to time– and I am no exception. But, one thing that is different about me now than earlier in my life is that when I screw up now I never screw up all that bad, because I quickly get back on track.
It is really difficult to try and never screw up and trying to follow that strategy in life will eventually cause you to fail and fail hard. It is a much better idea to plan that you will screw up from time to time and when you do have a plan to recover as quickly as possible.
You can’t help getting knocked down, but it is up to you to decide how quickly you get up again.
I didn’t quite say everything I wanted to say in this podcast, as both Iris and I were a bit out of it due to some recent travel, but I still feel the message is one that many people need to hear.
So, listen below and let me know what you think.
Here is my YouTube video for this week. This time I am talking about why you need to learn to stick with things if you want to be successful.
Too many software developers, and people in general, don’t have the true grit required to stick to things, and as a result they never achieve great results.
One of the best ways to maximize your success is to figure out what in your life or career is producing the greatest value for you– your vein of gold– and keep on digging. Don’t rush off to other parts of the mine until you’ve tapped out the vein of gold that is already giving you the most value.
So, check out the video below and let me know what you think.
What is your vein of gold?
I’ve decided to also start creating posts whenever I publish a new YouTube video every Wednesday to make it a bit easier to follow what I am doing.
In case you didn’t know, a few months ago I started creating YouTube videos about topics that aren’t exactly constrained to software development. (Much like this blog I guess.)
I usually talk about inspirational topics that I think will help you to become a better software developer and have more success in your life in general. Most of these things are lessons I’ve learned the hard way.
This week’s video is about not being afraid to look like an idiot. I’ll probably do a more expansive blog post on the topic sometime in the future, but much of the idea for this video came from the keynote I did at the Raleigh Code Camp last week.
In that keynote, I talked about how being afraid of looking like an idiot can really hold you back and prevent you from growing in your career and in your life.
I’ve found that just about everyone struggles with this fear or looking like an idiot, but once you recognize the value of overcoming it, doing so becomes much easier.
So, check out the video, you can watch it right here below. Let me know what you think, I’d love to hear your feedback.
Let me ask you a question.
Why do you think Bill Clinton gets paid $200,000 to speak for an hour?
Is it because he is such a good speaker that just hearing the magic words come out of his mouth will make you a better human being and drastically change your life?
Or do you think it might have something to do with the fact that he was the president of the United States of America?
I’m not doubting the Bill Clinton is a good public speaker. He is likely one of the best, but it is not his skill alone that commands such a high price. A large portion of his price tag comes from the name he has built for himself.
You might say that he has…
Style and substance
Just having style is not enough. Style is just a name without anything to back it up.
Have you ever been suckered into buying one of those products on late night TV? You know what I mean, the ones that they sell at 2:00 AM and throw in all kinds of extra things if you only act now?
That is an example of style, but no substance. You aren’t getting what is being sold. The infomercials are advertising a product much better than what you actually receive. When you open the box and try out the product, you feel like you got ripped off—and you did.
Substance alone is not enough either. I’ve known many very skilled people that couldn’t market their skills worth a dime. Often people who focus on developing their skills don’t feel that they have the ability or time to learn how to market those skills, so those kinds of people go underappreciated and never live up to their full potential. As a software developer, you are probably more likely to fall into this category.
To reach the ultimate level of success and truly increase your value, you have to have both style—the ability market yourself and make a name for yourself, and substance –the skills that pay the bills.
Whether you like Bill Clinton or not, you have to admit that he does have both; that is why he commands such a high price tag.
Skills are not as important as you think
One thing that many programmers and software developers find hard to believe is that skills are not the most important thing in advancing your career.
Don’t get me wrong, you have to have some skills and knowledge. Just like the dice-o-matic you bought at 2:00 AM and quickly discovered was actually a piece of junk, if you pretend to have skills and abilities that you don’t actually possess, your customers and clients will be just as disappointed and look for a trash can to drop you off in.
But, at the same time, most people can’t recognize the difference between someone who is in the 95% margin of skill in a field from a person who is in the 80% margin of skill in that field, unless they also happen to be an expert themselves in that field. Unless you are a doctor, or dentist or auto mechanic, you probably don’t have a way of really evaluating how good a doctor or dentist or auto mechanic is—although you can probably quickly spot a phony.
So, why is this important?
Because, if you are like me—or at least how I was—you are probably spending way too much time focused on increasing your skills and not enough time increasing your style; building a name for yourself.
What I mean by this is that if you are at a decent level of skill, you will see much bigger benefits in building a name for yourself than you will in increasing your skill further.
It doesn’t matter if you are an independent software developer trying to get more clients or sell a product, or you are looking to work for someone else who will pay you more money, or you just want to get that promotion at your current job. Whatever your goal or situation is, complimenting substance with style will multiply the value of your skills much more than increasing those skills themselves.
The best way to think about this is like a mathematical equation.
(Style ^ 2) * Substance – Expectation = Value
Let’s break it down.
Style is more important than substance, because while skills are essentially capped and become harder to increase over time, style can be increased to a much larger degree—you can always build a bigger name; get a bigger audience.
Plus, the effect of having a larger audience tends to increase exponentially. That is why commercial spots for the Superbowl are so expensive.
Now, from the style and substance multiplication we have to subtract expectation to get a true sense of value.
Consider the case where you bought that dice-o-matic from a late night infomercial. The style points were pretty high. Lots of great marketing techniques were at play to get you to make that purchase, but those techniques also tend to setup some pretty high expectations of what the product should do. When you see the guy on TV using the dice-o-matic to chop an iPhone into tiny pieces, it sets a pretty high level of expectation.
Style is high, but substance is pretty close to zero and expectations are high, so in many cases value can actually be negative.
You have to consider the same thing in your career, when you are marketing yourself and your skills. Some of the marketing techniques you could use to get a quick audience would also produce a very high expectation, so if you don’t have the skills to measure up, you are going to create some negative or very low value.
On the other hand, if you have a high enough level of substance behind what you are promoting and you are able to promote yourself in a way that doesn’t build up more expectation than you can deliver, you are going to be able to bring a pretty high amount of value.
Increasing your value
So, for many of us software developers and programmers the answer is simple. The most effective way we can increase our value is to learn how to market ourselves; a skill that I have found many IT people tend to lack. Of course there are some great examples of developers who do not lack this “style.” Most conference speakers and well known authors or consultants are very good at promoting themselves and really increasing their value by carefully paying attention to the equation above.
Now, of course, this is much easier said than done. I’ve also found that most software developers don’t really know how to go about marketing themselves. I didn’t either for too long of a time—and I am still learning how to do it every day. But, I have learned some valuable techniques that I think just about anyone can apply to build some points on the style side.
If you are interested in learning about how to market yourself to really increase your value, sign up for my newsletter here, so I can keep you updated on my future posts and videos covering that topic and much more.
I am planning some pretty exciting content around all of the information I’ve gathered over the years about marketing yourself as a software developer and I’ll be sharing a large amount of that information here on this blog.
Just published my 4th course for Pluralsight, Inversion of Control.
I was pretty excited to get the opportunity to do this course, because there is a large amount of misunderstanding out there about:
- Inversion of Control
- Dependency Injection
- Dependency Inversion Principle
- Inversion of Control Containers
I cover each of these topics in this course and then we even build our own IoC container.
If you liked the Back to Basics series, you’ll like this course. I go and dive a pretty deep into the real meat of the patterns and principles behind IoC containers. Then I cover using Unity and Castle Windsor.
I think it is pretty important that we understand clearly why we are using a particular technology or pattern and what problem it is trying to solve.
I see too many people jumping on the bandwagon of so many popular technologies without really taking the time to learn the background about the technology to understand why it is an effective solution to a problem and what problems it attempts to address.
As always I welcome any feedback or suggestions for future courses.
It has been quite a bit of work and a learning experience, but today my course on iOS development for .NET developers course was published on Pluralsight!
This course was designed to help someone that is familiar with .NET get up to speed and start building an iOS application quickly.
Having gone through the learning process myself, I tried to distill what I thought was the most essential things to learn from someone having more of a C# background like myself.
It can be really hard to learn a new operating system, technology, programming language and IDE all at the same time, so I try to break it down and really spend some quality time discussing each of these things.
I think the end result turned out really good. I am already started on part 2 of this course, which will dive a bit deeper into actually writing code and implementing features, while this course was designed more to lay a good foundation.
If you have already taken my Android development for .NET developers course you’ll notice I am trying to take the same kind of approach as we even build the same protein tracking application.
I found it pretty difficult to map some of the concepts in Android to iOS when I was first porting my PaceMaker application to the iPhone, so I tried to create a pretty good mapping between the two courses. It definitely can be frustrating when you know how to do something in one technology, but can’t even find the words to Google for that same concept in another technology.
I also wanted to take a minutes in this post to highlight value of a video training site like Pluralsight. I definitely think it is something every developer should have access to.
Having watched many of the courses on Pluralsight, and developed 2 courses for the site myself, I have come to realized that the true value in these courses is that you are getting a distilled and practical knowledge as opposed to many books that really are more reference based trying to cover all of a technology.
Obviously I am affiliated with Pluralsight, so I am going to say they are great, but I definitely think these kind of real world focused videos are a great way to learn a new technology or enhance your skills.
Anyway, I hope you like the course and if you have any questions or comments about it, feel free to email me or ask them here.
Look for part 2 to be coming in the near future.
As always, you can subscribe to this RSS feed to follow my posts on Making the Complex Simple. Feel free to check out ElegantCode.com where I post about the topic of writing elegant code about once a week. Also, you can follow me on twitter here.
I’ve been working on a secret side project.
You can find it on your android market by searching for “PaceMaker” or using this AppBrain link.
Or if you are reading this on your phone, try this link.
If you have seen a few of my posts on Android development, you might have guessed it is an Android application.
If you have seen my post on fitness, you might have guessed it is a fitness app.
Why another running app?
You probably are already familiar with the running applications that are out there, and several of them are really good.
So the question remains, why would I create another running application?
Let me tell you about my own experience trying to get back into shape and when I starting running and see if that answers the question.
Early last year, I decided to start running to get back into shape. I used a running program called Couch to 5k to get up to being able to run 5k.
I was able to use several of the running applications available for my phone at the time to chart my runs and even post them online. This was great, but one of the big things I was struggling with was knowing if I was running at the right pace.
On a treadmill this is easy, you can set the MPH you would like to run or the pace and the treadmill will hum along at that pace. If you want to be running at a 10:00 minute / mile pace, you can easily do it.
When you are outside running, you can’t just run at 10:00 minutes per mile. You can guess that you are running about that fast, but it is very hard to know.
It’s pretty important to be able to run at a desired pace, for two main reasons:
- Making it the whole distance (you don’t want to run too fast or you will die out)
- Improving your running (you need to start running at a faster pace gradually in order to get faster)
So as I was running I found that I needed to know what pace I was running, so that I could speed up or slow down if I was running too far above or below that pace.
Once I could run 5k, this became really important, because I wanted to improve my time, but I didn’t want to increase my distance. (Most experts say running more than about 5k tends to lead to muscle loss, I don’t want to lose muscle, just fat!)
I tried using a Garmin watch to monitor my pace, but that didn’t work out well for a few reasons:
- It’s clunky and you have to keep trying to look at your wrist while running which causes you to slow down.
- It’s hard to read small numbers on your bobbing wrist, especially in bright light.
- The GPS on it took forever to get a lock.
- The batteries were always dead when I wanted to run.
I set out to make a running application that was mainly geared around tracking your pace. What I wanted was audio notifications or vibrations which indicated when I was over or under my desired pace by a certain amount. I couldn’t find any application that would do this, so I created one.
PaceMaker is designed to solve a very specific problem, running at a desired pace outside. Sure, it tracks your run and will show it on a map, but the primary focus of this application is to help you run at your desired pace.
How does it work?
Once you download the application, it is very simple to use.
The main screen shows your current pace, your target pace, how long you have been running, the distance you have run so far and how many seconds below or above the current pace you are.
Notice the pace is in nice large numbers, so you can read it easily while running. If you tap the overall pace, it will show your current pace and vice versa.
Overall pace is the pace you have run since you started running while current pace is the approximate current pace in the last 30 seconds or so.
Pressing the start button will start your run, and pressing it again will stop your run, saving your run to a GPX file on your SD Card.
While you are running, if you are over or under your target pace by the amount you set, you will get a nice audio notification saying “Speed up!” or “Slow down!”
You can configure all of these settings in the settings screens.
From this screen you can set the target pace in minutes and seconds, and the distance in miles or kilometers. You can also set up the alerts.
From the alerts screen, you can set the alert to fire if you are running too fast or too slow by 15, 30, 45 or 60 seconds, or choose to not alert you.
You can also choose which sound to play if you are running too fast or slow. A default is provided, but you can select any ringtone on your phone.
Setting the vibrate function will vibrate the phone in a pattern to notify you if you are too fast or slow.
All the runs on your SD card can be viewed from the history screen. Selecting an individual run will display that run and the details on a map.
Comments or suggestions
This is my first Android app, so it was quite a learning experience. I would appreciate any feedback if you end up buying the application, and 5 star ratings are always appreciated.
I intend to fix any bugs or solve any problems that any users report as well as implement many suggestions, so if you have any please let me know.
If you wouldn’t mind sharing this link with anyone you know who is a runner and has an Android phone, I would be appreciative.
As always, you can subscribe to this RSS feed to follow my posts on Making the Complex Simple. Feel free to check out ElegantCode.com where I post about the topic of writing elegant code about once a week. Also, you can follow me on twitter here.
In the Java and .NET world today, I am starting to worry we are doing many things just because “that is how you do it.” I think this is a dangerous place to be.
It is a place where education and understanding are trumped by blindly following best practices without really thinking about why or when to apply them.
Not to bash Ruby here, but I think that the recent evacuations from C# and Java to Ruby are in many ways due to this degradation of practicality by so many of the experienced C# and Java developers out there.
I have to admit, I am guilty of it myself. I blindly add interfaces to classes that don’t need them just so I can dependency inject them into my class so that I can write my behavior driven unit tests using a mocking framework.
What am I doing about it?
I thought I would write a series of blog posts with the goal of getting back to the basics. I want to take a thorough look at:
- Why some of todays best practices exist
- What problems they are trying to solve
- What we did before relying on these techniques
- When they are applicable
I want to get back to a point where I am very clear that when I employ one of these best practices:
- I have a good reason for doing so
- It is solving a specific problem
- It has a net benefit
My goal is to take a “nothing is sacred” approach to software development and pick apart anything and everything.
I want to start by looking at some of the basic things like interfaces and ask questions like “why should we even use an interface?”
Honestly, I don’t know where exactly this path will lead, but I am going to take it and see where it goes.
But what about forward progress?
Aren’t all of todays best practices and techniques the result of years of forward progress in the profession of software development?
Yes they are, but that doesn’t mean they are right.
It’s kind of weird how progress works. We end up going down one path for a long time thinking we are making progress until it comes to a dead end, but some of the things we learned along that path allow us to go further on a different path, or open up completely new paths altogether.
It is only in developing solutions to problems that we find other problems that are caused by those solutions, which in turn cause us to go back and resolve the original problems in a different way armed with this new knowledge.
Want a good example of this?
The language itself has not changed, but how we use it has changed completely.
My only point in saying this is to open up your mind to the possibility that things we think are completely necessary today, like unit testing for example, may not end up even being considered valuable at all in the future.
Why is this important?
It is good to shake up your beliefs and questions them every once in a while.
Any belief you hold true should be able to hold up to solid reasoning. It is important to test our own beliefs every once in a while to make sure they are still valid.
Testing our beliefs can help us gain more confidence in the ones that are correct, and stop hanging on to those that are wrong.