A good setup goes a long way

I’ve been limited to a 13” screen to do my work on for ages and ages, well since July 2013 at least. The only person who did the limiting was myself. One of the things that contributed to the issue was working from home, and never having proper office space. DHH also praised working from his 11” MacBook Air on the go all the time. Although that is doable, and I first went with the 13” Air, then a 13” pro, there were certain times when something was missing.
Those certain times increased in rate and frequency when I started wearing different hats, working on everything from OPS, through backend Ruby on Rails, to front-end JavaScript development. Handling complex, multi-language projects is pretty tricky on a 13” screen. It’s not impossible, because I’ve been doing this for two years now. But if you can solve the pain you are feeling by buying a screen/mouse/keyboard combo, then there is no reason to suffer that pain.
Dissecting big problems into smaller chunks can also help a lot. But that also takes a lot of time, and you need to be able to look at the big picture once in a while. Although my eyes are still serving me well, there is no sense in destroying them on purpose. It’s also nice to be able to pass the Joel Test
So I faced another of those complex issues, where you have to look at the big picture while developing something. As it happens often, the lack of top level overview caused me to follow the wrong path a couple of times. Now, I don’t suggest impulse buying, and I investigated all the equipment beforehand. Luckily the computer shop near me had everything that I needed.
After a 10 minute setup, everything was up and running, I’m still getting used to my mechanical keyboard. It differs a lot from the MacBook keyboard I’ve been using for the last few years. But as I’m writing this article, I’m liking the feedback and the writing simplicity more and more. It kinda reminds me of the IBM model M keyboard that I had ages ago. I’d use it today, if my mother didn’t throw it away.
Having a 27” screen, alongside the 13” MacBook, is awesome. It takes me back to the time when I had to buy a new video card with my own cash. Then install it in my work computer on the previous job. Then I took an old 15” lcd from the company’s service room, putting it alongside my 17” screen. It was pure awesomeness back then, more or less.
Having an awesome chair also means a lot. I know people that praise their Aerons and Embodys and I don’t know what else is cool these days. I’ve sat in both of the mentioned chairs, and they are awesome. But I just won’t pay more money for a chair than I paid for my computer. Yes, you can buy a refurbished chair, but it’s still worth a hefty amount of cash. A few friends suggested that I buy Markus from IKEA, and I didn’t regret it at all. I can buy 10 of these chairs (maybe even more) for the price of one Aeron. And it’s an awesome super adjustable, comfortable chair.
What are your pain points with your computer setup? You have something that has been itching you for a long time. It’s easy to solve, and there is often an inexpensive solution to the problem. So go ahead and do it. Pull the trigger and buy the thing you need to flourish. You will feel the benefits immediately.

Your users are out to get you

How many times did you create a UI with a specific user flow in mind, and most of the time your users did something else? Did you ever experience users ignoring clear warnings and proceeding to do something dangerous to their data. Can we prevent this?

A user will always try to find shortcuts and model the app usage to what they seem fit. And it rarely happens that the end user uses the app in the exact way that you planned. If your app does allow users to skip any step in the flow, and do anything out of the boxed process you imagined, they will do it. Not all the time, but in your professional life you will encounter what I like to call creative users.

Now, I’m not saying that all users are ignorant, stupid, or criminal. But you must have that in mind when creating an application flow. Ideal user input that I can think of would be one button on an otherwise blank page. But even that imposes a couple of questions: How do we know who pressed the button? Did we state what the button does? Does the end user understand the language? If we do know who pressed the button, are they allowed to press it? What does the button do? Questions, questions…

There are also hackers, benevolent and malicious. And there are idiots that download hacking tools from various forums, playing stupid games. Now, I think that in a broader sense, benevolent hackers are doing great work for the community. You can’t plug all leaking holes in the thing you are building. It goes on a much greater scale when talking about libraries or web servers, ssl and encryption. While malicious hackers are after the money, they also expose holes that you learn how to plug. To be honest, no education is free, sometimes you pay less, sometimes more.

This is why having a good security practices works in the long term. Using a framework like Ruby on Rails solves a lot of that stuff for you. But don’t forget that you still have to have at least a grain of common sense. Even Rails allows you to shoot yourself in the foot, if you don’t follow the guidelines. Also don’t forget to upgrade to the latest security fix, or a maintained branch. Upgrading the frameworks or libraries to the supported versions might seem like a tedious thing to do, it’s the only smart option out there.

There are some drawbacks in using open source software. The number of solutions out there is huge. It’s hard to pick and choose the correct solution. I could suggest going with Ruby on Rails here, but that’s just my pick. Open source is also a great pool for learning new things. If you don’t seem to like one approach, nothing is forcing you not to create and publish your own solution. Just be sure it’s documented and tested, you created it because you weren’t satisfied with some other solution out there, right?

Back to (non-)malicious users again, that form you made to enter the email twice to verify it, it doesn’t work like that. I’ve experienced someone that used my own personal email to set up their Facebook account. My email wasn’t hacked (I hope), Facebook’s email verification sucks). I’ve since hijacked and archived the account, so no one can reuse my email to register again.

Now imagine a benevolent user, registering for your web service, and they enter a wrong email. I’ve worked with applications that have non computer savvy users, and that happens a lot. You make a typo, whatever, just while entering your email to register. Even my father who has been using a computer at work for the last 16 years or so still has troubles with typo’s. It’s not second nature to him, as it is to (most of the) computer professionals out there. And I believe you, the reader, are one of them.

Don’t judge a man until you have walked a mile in their shoes. Almost every culture has a variant of this proverb, and for a reason. The main premise is to do your best to see and feel what the other person is seeing, or feeling. Try to replicate their mindset while using your application. It’s easy creating applications for IT professionals. But when you realize that this is only a small percentage of the general population, the light bulb in your head might go off. Then you can think about a better solution to do the same once difficult task that only a few people understand.

Billionaire empires are created on simplifying complex stuff. Google simplified search and email. Apple simplified smartphones, and obtaining music before that (well at least legally). but there are lots of smaller examples, and you just have to look around to notice them. Complex UI’s have no place anywhere in the world, not even in airplanes or space shuttles. You need a lot of them, and sometimes you must have knobs and gouges somewhere where you wouldn’t like to have them. But if 99% of your users aren’t using them, maybe you can at least hide them from plain sight. You could even remove them, and get on with the fact that 1% of your users might leave. But the other 99% will have a much better experience.

It's really easy to quit

I remember when I was in my late teens, although I rode on the bicycle around a lot, I never did anything longer than a few kilometres in one go. I had an old steel mountain bicycle, heavy as hell, but it was enough for me.

Once I decided to visit a friend who lived about 25km away, and decided to bike there. It was one of the worst experiences in my life. I barely managed to do it, having cramped muscles for days after that, also I went back home by train, bicycle with me.

Nowadays, after 15+ years I can successfully ride for 100 and even more kilometres, probably using less energy than ever before. I admit that I have better bike(s) now, but that is not the point. 15 years ago I just gave up on the spot, as soon as it got hard. Quitting was easy, except for the next couple of days when I could barely walk, but the act of quitting seemed pretty liberating. You just run away and don’t look back.

A few months ago I went on a ride alone, and after 2 pretty hard rides in the two days preceding the current ride, my legs were pretty empty in the start. And I had 4 climbs on the route. I almost gave up after the first climb, but then something hit me. The pain you are feeling now, just means that when you go out tomorrow, or the next day, you will be even stronger than you are today.

By putting constant effort, especially when you don’t feel like it, you will gradually improve. I like to measure my cycling performance a lot, because if you can measure something, you can improve it. I’m far from being a pro, and I’m pretty far from competitive racing, excluding one with myself. The bike pulled me out of a really bad place I had put myself into. I’ve lost 40 kilo over 3 years on the bike, and now I’m feeling better than ever.

I’m using a cycling analogy here, because it’s the easiest thing that comes to mind here. But the real story I want to tell you is about yourself. You are the one that quits when it gets hard, I know it, I was the same, quitting when things get tough. Requiring constant and immediate feedback is something people cherish a lot, but the things that give you immediate feedback are mostly bad for you.

What I’m trying to point out here is that you are the only person responsible for your own destiny. If you are willing to go through life as a quitter, giving up as soon as it gets a bit harder than usual, you will become weaker and weaker. By not challenging yourself with new things every day you slowly degrade.

There is a pretty common saying that businesses which are not growing are falling apart. You could be stagnating, but given that everyone else around you is growing, you might as well be in the red, it is mostly the same. And this relates to people really well. Just think about your parents, or grandparents. Some of them know how to use a computer, some are pretty proficient with it, and some can’t even use a microwave.

Back to you, if you are a programmer, there was a time in your life when the only thing you knew how to code was ‘Hello World!’ in some language that you don’t use anymore. Why did you continue through the hardships of learning other languages, patterns, algorithms, just to call it quits today?

I hopefully have a couple of decades left to do something productive, can’t even imagine the language I’ll maybe be writing code in before I choose to retire. I might not even be writing code then, but I’m not afraid of it at all. Life is a constant change, and by accepting it, and going with it, you will find yourself being a better person than you were before.

One person told me a pretty resonating thing, and it stuck in my head. If I didn't challenge myself to do hard things, I would still be stuck doing a shitty job that I did 3 years ago. And it’s true for me too, on different levels. I now have a really great job, more energy and a lot more chance to hopefully get to see and play with my grandchildren in 20+ years. And I don’t really care about what will happen tomorrow, because I know I will deal with it.

P.S.

Exercising is really good for you, and you must start immediately if you want to play with your grand children, even great-grandchildren if you are really lucky. I know people who can’t even go out and play with their own children because they just called it quits on their own health. It’s really sad, but I don’t think they will even live to see their grandchildren. Tech jobs are pretty sedentary ones, and I know how easy it is to stuff yourself with fast food, while working 12+ hour days, getting bigger and bigger. If you are in this situation and don’t know where to start, there is a great book by Joe Kutner called The Healthy Programmer. If you need more help don’t be afraid to contact me. I’ll be glad to help you get on your way to feeling and doing better.

Don't (only) focus on the code

Every developer aspires to create great things, but often the most important issue is not just the quality of your code, but many other and obscure things that are setting you back from achieving your and your company’s goals.

You should write good, well tested code, which doesn’t have to be perfect, but merely good enough. I know that some of the purists will get mad but that is often the case. As the saying goes, Perfect is the enemy of good enough. I won’t go into the quality of the code anymore, because I believe you, as most of the programmers do, write good enough code. What you should focus on is something completely different.

There are three things that you can do while working for a company or consulting for a client:

  • Create value
  • Reduce expenses
  • Both of the above

Ultimately I want you to always think of the ROI (Return On Investment), for either your employer, your client, or yourself in the end. If you steer away from that focal point, and start procrastinating on delivering the product, because the code, design, or copy is not perfect, you will never ship it. Also, if you are not embarrassed by your first release, you have shipped too late.

Now, think long and hard, what situations call for further improving the quality of your code to stick them in the three categories mentioned above? Testing and refactoring bad code will improve future maintainability, which reduces expenses in the long run. Optimising for performance and making the application faster can bring you more clients and earn more money. Optimising workflows will cut the time needed for the end-user to finish a unit of work faster, which reduces expenses per unit of work, allowing them to do more in the same amount of time, or to work less.

Automation is a nice thing to have, but unnecessary in the beginning. If the product that you are creating succeeds, and you start spending a lot of time on processes that should be automated, please automate them, and delegate the execution to someone else. But don’t do it before it really starts to hurt, because you are wasting your (and the company’s) precious time.

Understanding how and why the software does what it does should be the main thing for you to learn about. I agree that you can be some level III programmer in an enterprise behemoth, really detached from the process, being fed with your daily or weekly tasks through some project planning tool and not really knowing how the sausage is made. Maybe you are one of the Dark Matter Programmers, and aren’t really ambitious to move up, and that is also OK. I know people that are in the same situation as you are, happy with the work they are doing. Although I consider this approach highly insecure and uncertain for the long run, it is practical for the present, for them.

If you are focusing on the process, and eliminating the obstacles to reach one of the three points mentioned above (create value, cut expenses, both of them), then your software will be better in the long run. In that process you stop being just a programmer that is easily replaceable, and start being a true business consultant, with a unique set of skills.

As an example, there is a process that each end user has to do to make one widget. It includes going through 10 different screens, and entering a dozen parameters on each screen to produce the widget. Creating any type of widget generally takes 10 minutes Although the company makes different types of widgets, let’s say that one widget accounts for 80% of the sales, and all others for only 20%. Optimising the code in this situation does nothing, because the code has to produce a variety of widgets, and unless it’s really messed up, you should leave it alone.

Optimising the process on the other hand is something completely different. Especially if we have a situation like I mentioned above. I really love the Pareto principle, and try to use it all the time, applying it to any situation will allow you to focus on the stuff that really maters and ignore/drop the stuff that doesn’t.

How do we apply it to the above example? Let’s call the widget that accounts for 80% of the sales The Golden Goose. All widgets have around 100 properties you can set while creating them, but 95 of them are the same for each Golden Goose. So why bother entering and checking each one for a process that happens 80% of the time. Optimising the process from 10 screens and 100 parameters that takes at least 10 minutes and allows for a lot of human error, to one screen and 5 parameters, which reduces the widget preparation time to only one minute will drastically increase the user productivity, allow them to push out more widgets in the same time.

By focusing on the business and not only on the task at hand, you will stand out among your peers. There is no difference whether you are an employee, a freelancer or a consultant, your customers will generally have more respect for someone who looks at the bigger picture, and speaks their language. You can do yourself a big favour and read a couple of business books. It is a very big chance that you work for one, so why not invest a couple of hours in understanding how businesses work. It is a very small chance that those hours are spent in vain. If you don’t know there to start, The Personal MBA by Josh Kaufman is really great, and I can’t recommend it more.

The LinkedIn experiment

If you are an engineer you probably don’t see much use from LinkedIn as a service. It is full of recruiters, who can be very annoying from time to time. You can choose to link people you have worked with, went to school with, or know from one source or another. Aside from this fact, I didn’t see that much use in LinkedIn. So I decided to run a small experiment. No, I won’t give them access to my email or something stupid like that, but I’ll do my best to use the site as it was intended to.

I’m not really hoping to gain anything from it, aside from maybe a new connection or two. I know I’ll get spammed like there is no tomorrow, and that was one of the reasons I killed my profile a couple of years ago. But this time I mean business.

I’ll do my best to post updates, link interesting articles, fill my profile with everything I can, and even leave a review or two. I’ve already started doing some of those things, and I’ll follow the plan at least till fall.

As I’ve previously mentioned, I don’t want anything. I’m not looking forward to getting spammed by recruiters, and I probably won’t be looking for new projects soon. I just want to see what can be done with it. I’m always open to finding new acquaintances and similar minded people. I was also considering joining (or starting) a mastermind group, and maybe LinkedIn can provide some help with that.

If I don’t get anything out of this small experiment, and I sincerely doubt that I won’t, I believe it will be a small amount of time well spent. I’ll surely write a post about my results in a couple of months.

On continuous improvement

It is really hard starting something new. Just consider the first time you sat down at the computer to write a “Hello World!” program. Following the tutorial or whatever, you were able to copy/paste or type the code into some IDE or a REPL environment and run it. Then you decided to create “an application” and it was nothing like that Hello World example. Maybe you saw the video on How to create a blog in 15 minutes, and got hooked to this fancy new Ruby on Rails thing like I have. Regardless of the way you started, there is one constant in everything that you do.

If you do something consistently over a longer period of time, you will eventually get really good at it.

Consider blogging, or technical writing for example. Unless you were some kind of a teen writing prodigy, you can’t write that well. Especially if the school system you were a part of didn’t encourage creative writing. I struggled with essays and general writing throughout my school years. And I never thought that writing was a skill that everyone should have. After almost 6 years of on and off blogging, I believe writing to be a really necessary skill, and it really changes the way you express your self, and the way you convey ideas to other people.

Looking back at my posts from 2009, I can’t stop being sad for myself, because of the bad grammar, sentence construction, and even the notion of conveying ideas to people. But it got better over time. I used to struggle when writing 200-300 words in a blog post, and now a 500+ word blog post almost comes naturally.

Gradual improvement is a great thing, and if you hone your skill consistently, you will become an expert in what you do. I know I’m far away from being the next Seth Godin when it comes to writing, but I can try to improve with each post I write, and I can create a habit of writing every day.

You can do the same, choose a skill you want to improve, don’t set any goals or anything, just do it. If it’s writing, make a calendar entry each day and tell yourself to write e.g. 500 words that day. It can even be 100 words, creating a good habit is what matters most, not the amount of doing something.

Don’t set your goals too high, because you will never accomplish them, and you will loose the taste of all those small wins that come when you do get good at something, and realise that you have done something worthy.

There is a great app that I use, and it’s called Commit, and it is probably the best thing I could have done for me. This app, in addition to the Tiny Habits method by B.J. Fogg, was the cornerstone in most of my work.

It is hard to force yourself to sit down and write a 2000+ words blog post, but it is pretty easy to sit down and write 500 words. If you struggle with 500, start with 100. It won’t take you more than a couple of minutes accomplishing that goal, and if you really like what you are writing about, you can always continue. It’s the sitting down (or standing up at a desk) and starting that counts. Make that your daily habit.

You can always do more than the minimum, but set a realistic minimum that you can do each day. And your skills will improve. Of course, they will improve faster if you do it more, but don’t overdo it, because if you burn out, it will be really hard to start again.

Automated testing will add value to your software project

We have read enough about TDD and it’s demise in the last year. Since David published his post about how TDD is dead there have been a couple of flame wars concerning TDD and testing in general.

I believe that TDD is a good thing, but I don’t always practice it, as sometimes you don’t have the time to do it. I know, some of you reading this will say that there you must make time for TDD and that TDD is the only way. Maybe you are correct, but in a startup world there is rarely any time for testing at all.

With deadlines and churning new features each week, one can’t make the time to do proper TDD. And sometimes it seems that TDD is some relic from the past, from the really distant past. There is a nice report called Why Most Unit Testing is Waste that sums it up fairly good.

However, I believe in automated testing, at least having a full integration suite, following the application happy path, and any edge case you find later on. Also I’m not against unit testing, if it makes sense. Payment processing code, of course you will test it. Some code deciding if the label class is blue or red, well, you can probably skip that test if you have no time to write it. Rails controller tests are a great example of procrastination in tests. I don’t have anything smart to work on, let’s write a couple useless controller tests.

Unit testing external libraries is another thing, they should be properly tested, to ensure that their API behaves as it claims. Especially if your library is public, then you have to test it.

Having a thorough test suite increases the application value, and decreases the breakability because any subsequent change you make on an application that isn’t tested is like walking through a minefield. You never know what will break.

I would have liked that I learned this lesson the easy way, by listening to other people having issues when some of their code wasn’t tested and they had to change just one little thing, and something completely unrelated broke. However, that wasn’t the case, I learned it the hard way. With a really bad client, who constantly changed their mind about features (another red flag) we were implementing a lot of stuff, and changing it on a daily basis. Having no tests meant that you expected something else will break after deploy, because you just don’t know what can go wrong.

After I got burned by that, I started writing tests, trying to do TDD, but at least covering the process with integration tests as I went along. And it helped a lot, the sheer confidence when deploying the app that nothing will go wrong is really enough. And the client is better off in the long run, because there is no chance that the code breaks, and no one notices it.

Lesson learned: Don’t obsess with TDD or the proper way to test, but try to test the code as well as you can, have an integration/acceptance suite that you run before deploying, and try to cover as much of the app as possible with it. Don’t overdo it, and don’t test the language or framework you are using. Shaving Yaks is really fun sometimes, but don’t do it on a production application, because someone will read it later on, and think that you have to test every little thing.

Automating personal and business workflows

In an average month, there is a lot of stuff you will have to do. Stuff like paying the bills, taking care of inventory for home/company, budgeting, and your day to day work.

The best thing I have found to do it is to automate as much work as possible. I’m not only talking about programming something to do the work for me, but to write down all the processes that I’m using in my work and life.

By writing everything down, you are able to generate check lists, for every process. Although this sound pretty boring and lame, the alternative is panicking when you’ve forgotten to take the health insurance card to your vacation. Or your drivers licence for example. Or kids (OK, I sincerely hope that this one only happened in that movie) :).

Having a printed out check list does wonders when I have to set up a new server environment from scratch, although everything is scripted, there is always manual work involved. Checking each box gives you confidence that everything is working as it should be. If a process fails though, you are able to retrace the steps, figure out what went wrong, and fix the step, or add a few in between.

When you document everything, it’s a great time to hire someone to do the menial work for you. You don’t have to waste your precious time by paying the bills, or ordering water, or doing anything except the one thing you do best, whatever that is. That thing got you to where you are now, but most of us have businesses to run, and that also takes it’s toll.

Tolls don’t matter here, start with pen and paper, then see if anything else fits better. I use Markdown and ia Writer Pro to accomplish my goals, to write the process down, but lately I’m experimenting with something bigger, as I want to focus on writing more.

Don't obsess with analytics too much

If you are only an occasional writer, as I surely am, you don’t have to look at the analytics screen all the time. It’s a really nice thing to look at the real time data when you publish a new post, and advertise it on Twitter and other social networks.
But that one is a waste of time. Real time data doesn’t mean anything real. The main reason is that aside from satisfying your own weird obsession, you are not accomplishing anything that will help you with your goals in life.
The way I fight with it (when I eventually write and publish something), is scheduling it to be published in the future. When I set and forget, the urge to look at real time analytics data vanishes, because if I’m not personally involved in pressing the Publish button, then I’ll most probably forget that it’s being published at the moment, and work on something else.
As the best time to publish depends on many other factors, I tend to publish when I’m even not sitting in front of the computer. I’m trying to set a dedicated time to write each day, and it will take me some time to accomplish that. But your publishing time should always be the same.
I’m not advocating on complete analytics denial, because analytics are one of the best investigation tools you have in your work. You can see what posts people are most interested in, and focus on those topics, instead of those not being read much.
In a business setting analytics and lead tracking is really crucial, but real time data won’t help you with anything. Once someone is visiting the site, then it’s too late to change anything, so relax, don’t fuss about it and have fun.
Spring is coming, go outside and catch some sun, it’s good for you. And it’s much better than constantly looking who is on your website right now.

Entrepreneurs are made and not born

I was working with my dad in the orchard last Saturday, and after a while we sat down, had a beer and a great discussion. It’s the discussion that pushed me to think about the topic, and write this.
We were talking about the people in the country we live in (Croatia), and how the regions are different, people in one region seem to prosper, and almost struggle to survive in another one. The main reason we found in it was industrialisation levels before 1990’s. The region that was highly industrially developed, was thriving, everyone who wanted to work had a job, an absolute employment rate, the pay wasn’t much, but there wasn’t much to buy either, and people survived, but they also had big ranches, with the government buying off anything that was produced, so they got lulled in.
The region without industry, where people struggled, had a small piece of land, couple chickens, and a cow if they were really rich. Those people fought to survive, day after day. After the war, and destroying most of the industry we had, the first people fell in agony. 20000 jobs lost in a city of 50000 inhabitants, almost overnight is a lot. Most of the people started working with agriculture, but expecting the government to buy off anything they produce, at a highly subsidised rate, and protesting by blocking the magistral roads if that rate is not met. However, the other group of people got adapted to their struggling and took the only way they knew, they become entrepreneurs, mostly doing manufacture and agriculture. And because the market was(is) bad in the rest of the country, they exported everything. So they prospered, had no recession, no big job losses, and are almost completely government independent.
The point that I’m trying to make here is, that entrepreneurs aren’t born, they are made, out of necessity. When there is no one to give you a job where you would earn enough, and you have to feed your family or just yourself, you find a way to earn the money. From this an entrepreneur is born, a regular person, maybe not willing to work in menial 9 to 5 jobs. Not settling for dull governmental job security, or cruising from college till retirement, but living the life, taking risks, and succeeding.