Sunday, March 29, 2015

The Three Things Everyone Should Learn: Number One


I am not a college professor, nor a professional programmer, but from time to time, I get to impart some of my computer-related knowledge and skills to students of varying levels of ineptness.  I structure my classes in a way that everyone in the class learns something useful that can be applied in their own lives.  This is not so easy, because some of my students

have taken classes on the exact same topics as I am teaching, some are very skilled at those topics already, and a handful of my students don't know the difference between a right-click and a double-click.  But I start off every class with one key point: computers were created to be programmed to make our lives easier.  Computers were not invented so that we could check email, post selfies to facebook or play games, although these are all clever and arguably beneficial resultants of the age of computers.  No, computers were made to solve problems that we could not solve efficiently by any other means.  Therefore, when I think of programming, I do not think of it as a field of study, nor do I think of it as a thing for only the geekiest smart people in our society.  I've been programming all my life, often without realizing it, without connecting the dots in my path of development as a programmer, and when the option to study programming was presented to me, I ran for the hills.  Hell no, I don't want to be a "programmer."  But the power of programming is so compelling that, despite resisting programming as a profession, I cannot turn my back on it.  The truth is that I'm lazy when it comes to work.  I like to think big thoughts, taste fantastic food and drink, travel, experience neat things, but I don't particularly like working.  I like my profession, actually, but I don't like the tactical day-to-day tasks.  I have always taken exception to the mantra that if you love what you do, then you'll never work a day in your life.  I call shenanigans on that: every person I know has had to work, even if they love what they do.  There are just some aspects of having a job or running a business that are less pleasant but necessary.  So I've developed a mantra for my work that has soaked into the culture around me: if you do something the same way, repeatedly, following the same exact steps, then it should be automated.  This mantra is especially true for tasks that take an extensive amount of time, require instructions to do manually because there are so many steps, or are prone to mistakes when the steps aren't followed.  Imagine if every tedious task you had to do on a daily, weekly, or monthly basis was automated and completed within, say, 30 seconds.  How much time would you have to think strategically and creatively?  How many hours would you spend with your family or doing things for yourself instead of putting time in at the office to finish that report?  At its highest level, this is called exception-based management.  Spend your time on the exceptions, then oddities, the things that were so unforeseen that you wouldn't have known to program a computer to answer it, or you wouldn't want a computer to answer it.  Let the computer handle the rest of the monotony.  

Programming is, in my opinion, one of the most important, and overlooked, skills in today's society.  If you sit at a computer all day, I believe you probably could use some automation in your life.  If you have to email, post, learn, stay on top of, practice, sell, buy, look up, research, or write anything, you probably could use some automation in your life.  I may be a little biased from my own point of view, but my hope was to basically cover everyone who gets paid to do something, in the scope of "needing automation in your life".  I am positive that everyone could use automation, in their work, in their education, in their personal lives.  And we are living in a very exciting time of rapid growth and development in this area - a simple search on your favorite app store proves that for any generic task you can think of, there's an app for that!  Awesome!  
So if people are already writing apps for things, why does everyone need to learn programming?  Developers only write apps for one of two reasons: they see a need and believe that they can make money from it, or, they have a need in their own lives, and don't mind sharing it with others who also have that need.  But developers aren't the only people who have needs, right?  Heck, developers I know are the least needy people in my life: they have no need for clean clothes, showers, a neat home.  Just give them a cot, food and a computer and they're happy.  I kid, of course, I love my developer friends, they are some of the smartest and most interesting people I know.  But why should non-programmers sit around and wait for some developer to come along and write an app to solve our problems?  What if they never do?  Don't we have needs that are unique to our professions and situations?  Might there be novel needs that could be automated without a college degree in computer science?  My answer is yes: we all need to know how to program because we can all improve the world around us, make our lives simpler and easier with automation, so that we can get back to doing what we enjoy faster.  

I say that everyone should learn how to program, because I know that if I just said, "some people should learn how to program" or "one person in your organization should learn how to program," the very laziness that drives me to program would drive you to say, "she's
probably right, we need to get someone else to learn how to program."  Or in terms from our playground days, "Not it!"  I say everyone needs to learn how to program because some of you will not try, some of you will try and fail, and some of you will try and succeed.  And yes, having a few people on a team be very good at programming is awesome, because they can usually carry the automation needs of the whole team.  But I will caution this: when I write some piece of code to help answer a problem in someone else's work, I can only program what they tell me it should do.  When I write code for my own work, it not only is better logic because I have more insight into the problem and solution, it gets better with time as I use it and think of ways to make it faster, more helpful and more accurate.  In fact, I've written code for people who were in a position higher than my own, they have used it and were appreciative of my automation, but down the road, I took over their responsibility.  Managers are so funny when they give you more responsibility, aren't they?  They can rationalize it in such clever ways, in this case, "You're already familiar with the report because you automated it, so this isn't too much more than what you already know."  But inevitably, when I take over responsibility for something that I had previously automated for someone else, I find that they missed a lot of opportunities for further, better automation.  

Early in my career, I often found myself thinking, "If I only had a programmer to partner with, we could do so much..." As I've grown, I've realized that working with programmers is complex, because you have to be able to correctly identify your problem and describe the desired solution.  It is much harder to do this if you do not understand the logic of
programming.  It is also difficult to troubleshoot the inevitable problems that arise, if you don't understand for yourself what the code is doing.  All too often people blame the code, "it must be broken," rather than realizing that their inputs were incorrect.  The best-written code will solve for the more common possible human error, but once a macro is involved, any and all problems are blamed on the code, rather than on the user.  For this reason, people who are not in the profession of programming often are reluctant to help others because they are then liable for troubleshooting and fixing any and all problems that come up.  It is so much more empowering for individuals to write and own their code; you can customize it and tailor it to your own needs, you can rapidly develop and test improvements, you can troubleshoot (and find your own errors instead of having that angry developer rub your nose in your mistake), you can adapt it to changes in the inputs and output requirements, and you get a sense of pride from creating such a work of artful automation.  Putting the responsibility of programming on someone else's shoulders can be hurtful to them, less-than-optimal for you, and dangerous for both of you.  So, learn how to program.  Everyone.  

Having hopefully made my point, I will get off my pedestal and give you some practical, actionable advice on how to get started.  If you use Microsoft Excel or Access a lot in your job, I would recommend learning VBA, Visual Basic for Applications.  It is a modified version of VB, Visual Basic, so taking a VB course or getting a VB book would help familiarize yourself with the syntax and logic.  Start by Recording Macros in Excel or Access, and then examine the code.  Use the Internet, a class, or a book, to learn some basic concepts: declaring and using variables, "If" and "Select Case" statements, "For" and "While" loops.  Modify the macro you recorded using these concepts.  Bam!  You can solve a ton of automation needs in Excel and Access.  If you need to monitor a specific website for certain changes, or interact with a website to gather certain information, learn VB.  In both cases, you may also want to learn how to write CMD script to automatically run the macros and programs that you've programmed.  Learning basic programming of any kind, like Java, will help you better query search engines on Google, Amazon, and ebay.  Google Alerts is very helpful, but only if you set it up correctly using the best search syntax, for example.  For writing SmartPhone apps, I believe Java is still the best place to start, and there are several websites that offer free, yes, FREE, classes on how to program.  MIT offers open courseware for introductory classes, Coursera also has free college classes, Treehouse, Codecademy, Udacity, and Khan Academy are just a few of the available resources offering free training on programming topics.  The only problem with this approach to learning how to program is, well, you.  Until we develop the technology to download knowledge into your brain directly and immediately, you are going to have to set aside time to take these courses, go through the examples, and try programming.  And, if you're like me, you're lazy, so it is not easy to do.  If you go this route, I would recommend having a fairly simple, but useful, application idea in your mind; you want something to work towards and achieve that will give you immediate feedback on the usefulness of programming.  Learning to write, "Hello world," and sorting fruit by color are hardly helpful, but courseware has to provide generic, easy-to-understand examples for you to work through.  Having a project in mind will help solidify concepts that you can immediately apply to your idea.  If motivation and willpower to continue is a particular problem for you, then you may want to seek out a community college course or another class with regularly scheduled meetings that you pay for, to incentivize you to go and continue going and to get the most out of it.  

Learning to program, like most things in life, takes initiative to do.  But since not everyone in your office is going to do it, I can almost guarantee it will make you stand out among your peers.  Just be cautious not to be pigeon-holed as the programmer, if that's not the career path you want to take.  Take it from a non-expert expert, I can put code together but I am by no means a programmer, but the power to automate simple tasks has been a key driver in my ability to succeed in my field.  With great power comes great responsibility, and programming is the closest thing I can think of to a real-life attainable super-power.  Besides, computers were meant to be programmed.