From my posts so far you can already see some of my developer curses.
The first curse is I want to have a control over my software experience, which either means the program has to be highly customizable, or if the task is somehow simple, I want to create the program myself.
Sometimes I'm only curious, how hard can it be, but even I usually learn a lot during the process, it also cost a lot of time. Also I'm that kind of guy who if wants a bread, he doesn't go to bakery, but opts for wheat seeds and learns how to mill.
Obviously I don't have much spare time, because if I'm not experimenting, I'm working, only because I persuaded somebody to use some of my unfinished creations (which looked quite finished to me before the pitch).
The second curse is I'm a “forker”. I like to start new projects, but I don't have the endurance to deal with the hard stuff afterwards. As a result, most of them remain unfinished, also because I often treat them more like an academic endeavour and I prefer to have everything thoroughly thought thru, than glue it somehow together.
I like starting new projects also because in the beginning everything is small and simple and I like that. After a year of development the source code is huge and bloated, with technical debt here and there, so it gets messy and I start to lose motivation to work on such project any longer because of it.
It's the well-known Pareto rule of 80:20. After I finish the 80 % of work that require 20 % of time, that's it for me. I'd love to have somebody else to pick up the task right there and finish it.
When dealing with difficult problems, that requires a lot of time and effort, I have a tendency to procrastinate. Other times I figure out a better way how to do it during the development, so my motivation shifts to reengineering and hey – new project! Tada!
When I did a roadmap for Quiky, it was quite nice, but it wasn't effective enough. I created the WPF version, which I still heavily use, but my needs exceeded what was easily achievable and now I'm in the unfinished state once again, currently because I'm having hard time syncing changes between the app, a server and a mobile version.
The third curse is I'm a performance freak, I want my code as much microoptimized as possible. Last year's ECMAScript 2015 (ES6) added great new features, but in most cases it's just a syntactic sugar, that in general is slower, than older constructs (as performance tests are showing).
Array.forEach
is slower, than plain for
loop; array.push(x)
is slower, than array[array.length-1] = x
; promises looks slower, than callbacks; classes and modules have bigger overhead than plain functions.
I also order clauses in IF statement, so the fastest one is evaluated first, and I prefer OR over AND, because while in AND all clauses are evaluated, if one OR clause evaluates to false, it skips the rest, saving some CPU ticks.
This goes hand in hand with my dislike of various third party frameworks, which in fact may be my fourth curse. But it makes me furious to see how some other devs mash together tens or even hundreads of packages and libraries, without much thought about performance and amount of data the page will need to download and process in order to work. I saw a project that combined Angular, React, jQuery and Underscore. The final bundled JS script had over 10 MB minimized. Running that on a phone, it would make it a nice heater, but only for a few minutes, until the battery runs out.
And finally, my fifth curse is, that my brain is for whatever screwed up reason wired in the way I'm keeping my code compatible with legacy versions of the runtime.
It's maybe because some of our customers still use IE11 (company policy), as well as some of my WinForms programs use WebView, which is also powered by IE11.
In PHP I still retain backward compatibility with 5.X as much as possible, maybe because many shared environments I have to run my apps in still use PHP 5.6 or even 5.4.
I internally struggle to get on a bleeding edge, despite it offers way better programming experience most of the time. It's like I expect some new device will be powered by [''insert_platform_name''], but only with limited set of features. This may be remnants of my long term “relationship” with .NET Compact Framework, which was pretty much exactly that.
If you want to personalize user experience and store user's preferences, you need to either store user preferences on-device, which is only temporarily persistent, or you need to store it on the server, for which you need to uniquely identify the user. This is obviously done by user accounts, for which you need a registration, also called “sign-up” process.
You should want to require as few things from the user as possible. That's why many services use e-mail address instead of username and many of them use third other identity providers, mostly social networks, where you're probably already logged in and therefore you only confirm your wish to provide your details to the website.
Very streamlined process without any third party would be: enter your e-mail address and you're immediately logged in as a user. If you want to log in later, click on a link/button in the confirmation e-mail you received as a part of the login process, and you'll be prompted to enter your password and maybe even a username.
You may require the user to confirm his e-mail address before he can start creating content. Until then there's only a sandbox or samples for him to play with.