- What is a “hackathon”?
- The problem with “hackathons”
- Why do students participate in a “hackathon”?
- Advice for students participating in hackathons
- Hack (verb)
- Don’t focus on convenience!
- Choose self-hosting
- Self-hosting in the context of IoT
- Can you optimise for learning, instead of delivery?
- Use a Free Operating System!
- Can you choose to build free software?
- Choose free-software on the cloud, not software-as-a-service
- Reject APIs that deliver convenience at the cost of control and freedom
- Take the hard way!
- Keep a work diary
- Get in touch!
Many students participate in over-night programming events dubbed “hackathons”. Such events provide a good opportunity for students to try their hand at solving one problem over a 24 to 36 hour period. However, in a bid to provide a working solution to the problems they have chosen to work on, students often resort to using a rather unfair mix of proprietary software, framework and non-free cloud services. While this does enable them to build something “novel” very quickly (ie. in the 24 to 36 hour time period reserved for the hackathon), it does not do much in terms of challenging them or creating deeper learning opportunities.
At the same time, the rules and constraints of the hackathons themselves are very broad and generic. The organisers tend to focus more on the encouraging students to build “seemingly novel” solutions to the problems they are working on. Focus on using Free Software or GNU/Linux is completely absent as is any focus on self-hosting the software and hardware infrastructure required to build the solution. The absence of such a focus means that a valuable opportunity to convey the value of software freedom to students is lost.
In this essay, I try to examine why students make the sort of technology choices they make and how, by optimising for convenience and ease-of-use, students miss out on building better capability and appreciating issues related to online privacy and software freedom.
A student hackathon in progress at SIT Tumkur
What is a “hackathon”?
I am not sure why such programming and problem-solving contests are called “hackathons”, but they are. They are organised by engineering colleges to encourage students to solve problems and build solutions over a focused 24 to 36 hour time period. Students are required to choose a theme they would be working on and then provide an abstract of what they are trying to achieve. They then use the hackathon to actually build a working solution and demonstrate it.
The problem with “hackathons”
The focus of various hackathons is usually “vertical” in nature - ie. they focus on specific technology domains or sectors in which students can pitch their projects. These verticals, such as IoT, machine-learning, socially relevant solutions and so on don’t offer any constraints or guidelines about how the problems must be solved. Hence, students are free to choose the software, the architecture, the technology stack, the operating system and so on.
This, I feel, is the loss of a great opportunity. In my view, it is not just enough to come up with novel and innovative solutions to problems. It is not the “what” that is as important, as the “how” and “why”. (In other words, “what” problem a student chooses to solve is not as important to me, as “how” they choose to solve it and “why”, ie. their reasons for choosing to solve it.)
While the “what” part of the problem-solving might focus on selecting which problem to solve such that it could be a commendable achievement and which could be attempted in the 24 to 36 hour time slot, the “how” part of the solution would look at the issues related to the ideology, architecture, licensing, freedom, privacy and the self-hosted nature of the solution.
Hence, if I am optimising for freedom, learning and control, the “how” aspect is more important for me than the “what” aspect. The world is full of extremely novel and innovative products. But very few of them are built to respect the freedom of their users.
What is there to gain by creating more solutions that only add to the body of proprietary software, hardware and network services that already exist?
Why do students participate in a “hackathon”?
My observation is that students participate in hackathons for some or all of the following reasons:
They really care about the problems they are proposing to solve and feel that the environment of a hackathon will actually enable and motivate them to build the solution they want to build
They get credit for participating in such events and it would look good on their resumes
They seek to compete and achieve something in front of their peers
They want to test themselves to see if they can build something working in a sprint and with limited time
The prize money is something to aim for as well!
Dear student, the way I look at it, these goals above don’t provide enough long-term value to a student. It is not enough to focus on the outcomes, ie. achieving the goals of the project or showing that you are capable of building such-and-such thing. A hackathon is one of the best opportunities to learn and challenge yourself. The 24-hours that you spend with complete focus, all amenities and no distractions can help you learn a lot.
Hence, think beyond just building whatever you’ve set out to build. Aim for finishing the hackathon with a lot more insight, exposure, awareness and inspiration than what you came in with. I have some tips how can do exactly this and more.
Advice for students participating in hackathons
If you are participating in an upcoming hackathon, please consider the following points. They might enable you to carve an extremely valuable learning experience out of the hackathon. Making some (or all) of these choices will only affect “how” you build your project - not what you set out to build. As a side-effect, you will have chosen a more ethical means of building a solution - one that does not force the users of that solution to sacrifice their freedom, choice, control or privacy.
Hackathon is a word derived from the verb, to hack. So if you’re participating in a hackathon, the first choice you could make is to hack. A hacker hacks. You are participating in a hackathon - imbibe the spirit of the hacker ethic in your work.
Who is a “hacker”?
A person who enjoys exploring the details of programmable systems and how to stretch their capabilities, as opposed to most users, who prefer to learn only the minimum necessary
A person who delights in having an intimate understanding of the internal workings of a system, computers and computer networks in particular.
One who programs enthusiastically (even obsessively) or who enjoys programming rather than just theorizing about programming.
What is the “hacker ethic”?
Hackers are doers.
They care about doing things.
They care about access & freedom of information, and improvement to quality of life.
If you can understand the hacker ethic and how it has influenced the free software movement, you will be able to understand and adopt the same values into your work and life.
Can you use the hackathon as an opportunity to examine, understand, validate and adopt the hacker ethic?
Don’t focus on convenience!
This advice might seem absurd at first. But let me explain.
While observing the choices that students make during hackathons, I concluded that most of the choices are aimed at cutting down on the amount of work that they need to do. This is a strange choice! Why would you, as a student, want to save work for yourself? Doesn’t doing something enable you to understand it better? By eliminating the need to do even very simple and basic things, are you also not forgoing the opportunity to learn so much?
For example, at a hackathon I observed that almost 90% of the students chose to use a cloud-hosted and proprietary database software called “Firebase” for their database needs! When queried about the reasons, they pointed out how simple it was to program it from a mobile application or a web application alike. They did not consider the fact that they were forcing their users’ data to be stored on “somebody else’s computer” (ie. the cloud) and the software that was being used to store this data (ie. the firebase database) was proprietary and out of their control.
The other 10% of the students used MySQL, Postgres, MongoDB and SQLite for their database needs and went about setting up and maintaining these databases by themselves.
Focus on “doing things yourself”
The problem here is simply that of an excessive focus on “convenience”. Using firebase, for example, might be extremely simple and maybe you integrate it into your project quickly. But what is it that you learn by using it? How to consume an API to use proprietary software to store simple data?
Think again. Are you participating in the hackathon to have convenience? Are you going to stay awake for 20 hours (or more) at a stretch just so that you can take such short-cuts?
When you do things yourself, you learn so much more and you have so much more in your control. Plus you don’t impose your choice of using proprietary software onto your users.
The corollary to rejecting convenience is to choose self-hosting. You choose self-hosting when you build and maintain all aspects of your project yourself. You host these “aspects” on your own hardware - laptops, single-board computers, micro-controllers, servers, virtual machines etc.
Choosing to self-host is a required condition to choosing free software to power your project. If you can not self-host a tool, how do you know if that tool is free/open source software?
What can you self-host?
There is always a way to host everything you need yourself. It could be that you are not aware of such tools or ways of doing things. Can you use the hackathon to discover ways of self-hosting everything?
You should be able to be build everything you need and hence, control whatever you have. This includes databases, network services (DNS, DHCP, email, NTP etc), file services (object storage, block storage, shared file-systems), application servers, containers, virtual machines, time-series databases, monitoring systems, wireless networks and so much more.
Self-hosting in the context of IoT
Usually, an IoT solution consists of the following “layers”. You should have complete control on all these aspects of your solution. The reason I single out IoT here is because I feel that there is not enough information out there about how one can build 100% of one’s network, cloud-backend and firmware infrastructure using Free and Open Source Software exclusively.
Consider the following points:
Your hardware and physical setup
This includes your micro-controllers, single-board computers, circuits, PCBs, serial and network cabling etc.
Choose your hardware such that you retain the freedom and flexibility you require to build your project.
Firmware, programs, source code, network connectivity
Any hardware you choose should offer two basic freedoms to you:
(a) The freedom to program the hardware using GNU/Linux
(b) The freedom to compile and execute your programs using a compiler or interpreter licensed under a Free/Open Source Software license
Choose your networking setup such that:
(a) you can run the wireless and wired network using your own access point to aid control and debugging (extra points for you if you can run this access point using a free software operating system such an OpenWRT or LibreCMC)
(b) you don’t have to blame someone else when your program does not work
Metrics storage, analysis and alerts
Often tutorials or books that talk about IoT introduce and use proprietary software hosted on the public cloud to storage sensor data and metrics. Functions related to analysis and alerts, then, are also handled by the same set of proprietary software running on the cloud.
Instead of this, can you choose to use Free Software tools such as InfluxDB, Prometheus and OpenHAB to store your sensor data? Can you use a simple instance of Grafana to graph and analyse this data? Can you send out alerts and detect anomalies using the various features offered by the tools mentioned above?
These are very capable, comprehensive and easy-to-use tools. Don’t choose to use proprietary software just because that is all that you are aware of. At any juncture when you have to make a choice of what software to use for a purpose, search and evaluate how you can do it yourself using free software tools.
Remote access and control
Most IoT solutions that connect to a network (wired or wireless) need the ability to remotely access and control the device. Often, the simplest way of doing this is to use protocols such as MQTT. The significant value-add that is provided by cloud-hosted IoT backends is an effortless way to use MQTT.
However, if you spent some time understanding how MQTT works, you could do the entire setup yourself. Using tools such as OpenHAB or Home Assistant, you can get ease-of-use while still being able to use free/open source software and self-hosting it on a single-board computer (eg. Raspberry Pi) or your laptop.
Can you optimise for learning, instead of delivery?
In my view, the reason students take so many short-cuts during hackathons is because they are optimising to deliver what they have committed on as the deliverable for their project. There is nothing wrong in focusing on this - however, if this focus forces you to take short-cuts and does not create enough learning opportunities for you, then you are not capturing enough value from the hackathon!
Instead, my advice is to focus on learning. Whatever you do as a part of building your project, evaluate how not doing what something “conventionally” can provide greater learning opportunities to you. Often this learning will emerge because you use to self-host a Free Software tool for your project or because you choose to do something yourself.
By focusing on learning, there is a good chance that you will be proud of your achievement at the end of the hackathon. And this still does not change your ability to actually deliver on your intended goal - it might just change the way you deliver it.
Use a Free Operating System!
I would have thought that in 2018 it would be obvious that students (and developers) would use GNU/Linux. But my observations suggest the contrary.
When all aspects of your work are actually free software tools, why run them on a proprietary and non-free operating system? Programming languages such as Python, Ruby and NodeJS are all licensed under various free software licenses. Databases that you use, such as MongoDB, SQLite, MariaDB/MySQL and PostgresQL are also free software tools. Your programming IDEs such as vim, Atom or even the Arduino IDE are all licensed and available under free software licenses to you. Arduino libraries and MicroPython (to name a few of the embedded IoT toolkits) are also free software.
There is a lot more value to derive from these when you run them on GNU/Linux. While almost all of them are cross-platform and can run easily on Windows or macOS, I don’t see how doing that provides your a better learning opportunity or an opportunity to get better at doing whatever you’re doing.
So use Debian GNU/Linux or Ubuntu or Fedora on your laptops and run all the tools that you require seamlessly. No need to use virtual machines to run GNU/Linux just because you want to use Docker to run something in a container.
Can you choose to build free software?
While it might be too early to think about releasing and sharing your software publicly, I would actively encourage you to do that. Doing this is not only an ethical choice to make, but also provides unprecedented learning opportunities.
If you need help to figure out how you can release your project under a Free Software license and which license you should choose, I would be glad to help you out.
Choose free-software on the cloud, not software-as-a-service
This is another way of talking about a point I made earlier. Consuming and using software offered as a service (eg. database as a service, MQTT as a service, analytics as a service etc.) is a covert way to use proprietary software. Most of the times the software that is used to power such services is not available to you to study, setup, modify or self-host. Additionally, your data is stored on (and locked-in to) such software-as-a-service offerings and once you use them for some time, it might be difficult or impossible to leave the platform and choose something else.
When you have to use software that does not run on your computer (ie. software which is hosted on the “cloud”), ensure that it is free software. This will give you the freedom and choice that you need in future. Don’t choose to use a software-as-a-service offering just because it is accessible, popular, free-of-charge or convenient. Making these choices neither offers learning opportunities to you, nor freedom, privacy and control.
Don’t make short-term choices that will remain with you in the long run.
Reject APIs that deliver convenience at the cost of control and freedom
Using APIs that are backed by proprietary software offered as a service is another way you compromise on your freedom and learning opportunity. Often an API is just an easy way to do something that requires no setup and gets you “productive quickly” and by doing “lesser work”.
Thing about this: Is it essential to use an API to build whatever you’re building? Can you do 2% more work and eliminate the API? Can you self-host a tool and use the API on a network and with software that you have complete control on?
How about substituting the API with a protocol? Eg. A popular way to send an email is to use a web API offered by a service provider. Instead of using a proprietary API, can you build a SMTP server on your own to achieve the same goal? It would be a wonderful excuse to learn how to setup mail services!
APIs are conveniences that can cost us our freedom if we are not careful and vigilant. Don’t make these choices now to deliver something quickly which might limit what you can do in the future.
Take the hard way!
Convenience does not facilitate learning, it eliminates it. You should optimise for learning. You should welcome problems and challenges because they present a learning opportunity to you.
“There is no such thing as a problem without a gift for you in its hands. You seek problems because you need their gifts.”
Richard Bach, “Illusions”
Take the hard way. Don’t avoid problems because you perceive them to be difficult and an impediment in achieving whatever you’ve set out to. Problems that we face when we build something are essential to helping us learn and become more effective at what we do. All problems - technical, personal, time-management, collaboration etc - are just indicators of what more we need to learn.
When you eliminate the problem, you also eliminate the possible lesson associated with solving it. Is that why you are participating in a hackathon?
The “gift” of a problem is the learning and capability that emerges from attempting to solve it. The problem is not permanent, the learning is.
Keep a work diary
Maintain a simple “work diary” to record what you need to work on, what problems you faced, solutions you considered when trying to solve the problem and finally, how you solved it. Use this diary to also note down questions that came to your mind but which you could not answer conclusively right then. If you take an inventory of such questions, challenges and problems, you can re-visit them again after the hackathon and continue your learning and study.
Maintaining a work diary is also a good way to reflect upon what you did. It is not always possible to recollect how we did something or why. A diary would be a good way to record these things while we are doing them and while they are fresh in our minds.
Later, you can use this diary to publish an article or a blog-post about “how you built X”!
Get in touch!
I am always reachable via email: firstname.lastname@example.org. Please feel free to write to me in case I can add value to your work or help you become more effective in creating learning opportunities.
All the best if you’re participating in a hackathon in the near future and I hope that you find the advice above useful and actionable.