Home iOS & Swift Books Living by the Code

An Interview with Marcin Krzyzanowski Written by Enrique

Marcin is an eclectic developer with years of experience in mobile and desktop applications, as well in enterprise solutions. He is a 10x developer who likes to learn new things with a pragmatic approach to the art of programming. Occasionally, he speaks at conferences and shares knowledge. Active in open-source software development communities, he has published a wide range of iOS/macOS libraries and tools, such as CryptoSwift, ObjectivePGP and the amazing Online Swift Playground, capable of running Swift code interactively from a Web Browser. He’s currently working on SwiftStudio.app, an indepedent third-party IDE for Swift.

Connect wtih Marcin

Twitter: @krzyzanowskim

Website: blog.krzyzanowskim.com

Speaker Deck: speakerdeck.com/krzyzanowskim

GitHub: github.com/krzyzanowskim


You are an incredibly proficient open-source producer—maintainer of CryptoSwift, among others. From your experience, is it possible to make a living out of open-source software?

I think it’s very hard or even impossible. Lately, I saw a diagram showing that even the most popular open-source projects don’t receive enough money to provide a living for an author or team. There are a couple reasons why you cannot make a living out of open source or why it’s very hard.

The initial thought behind open-source was to share the code, of course, everything being free. Over time, the big companies started to use the code and turn that into their revenue without paying back to the community. That helped build backend stack at Amazon. Many of the big companies are built on the shoulders of open-source projects.

I can speak of CryptoSwift, which happens to be a quite popular library. After publishing CryptoSwift, it started getting GitHub stars; however, a star is not a sign of popularity of an app or tool because the star doesn’t mean that the people actually use it. Then I saw that GitHub gives us stats about the frequency of visits; daily, it’s thousands of downloads, now. At the same time, I saw the third-party analytics report that there are millions of installations in applications that use the CryptoSwift library. Also, a few people told me they use the library. I was surprised when, at first, somebody told me they knew and used my library. This indicates that all this kind of feedback is not necessarily transferred back to the authors.

And if the feedback is not going back to the creator, then the money isn’t going back as well. I tried to get some donations. I have a donation link. Well, over five years, it’s got a total of like $50.

There were two companies that needed the functionality we provided and wanted to sponsor the feature implementation. I implemented that and merged it back to the open-source codebase, so everyone profited from it, and I got some money for my work. But that only happened twice.

Mostly you have to have another job to pay your bills and use open-source as your side project, which is valuable, but it’s hard to focus on that full time. Open-source work can also give you visibility and opportunities when you are searching for a gig, or companies are looking for new employees; they see that you are an author and can read the public comments on your work.

The thing is for instance OpenPGP is hard; nobody really understands old technology and so it’s hard to build such a tool by yourself. I spent a few months building this library and I thought, okay, now I will sell it. By now, I sold a few licenses. I know that some of the companies just use the free version that is available on GitHub.

And I also got, and this one is significant, some funds to keep the project up and alive for a year. It was a few years back. My work was crucial for proper functioning of a company’s product. This is the sponsorship of living from the open-source I would like to see more often.

If you rely on the open-source product—say, the “webpack,” which is extremely popular in JavaScript or other free tools to build the code—and you cannot contribute back by coding, it’s fair to pay for it. There’s a greater chance that the product will not disappear next year, which will also affect you.

Sometimes, publishing the open-source can help you be better known and will affect your visibility. I’ve heard several times from different people, “I know you wrote this, so you’re probably familiar with the subject, so we may be interested in you helping us build something else.”

I worked on the open-source projects because I was interested in the subject. I was learning and getting some level of expertise. I could help companies or people to build solutions based on my knowledge.

And here’s a funny story: I once found, on one of these freelance-employment websites, a job offer to add CryptoSwift into a company’s app. Somebody wanted to use CryptoSwift and I applied… Well, my offer was too high for them.

It seems to be one of the problems in these platforms that, because they’re open to the entire world and we live in a time of globalization, there might be people from countries who are cheaper to employ. If companies are purely basing value on price, that isn’t great for developers trying to make a living.

Yes, definitely. I’ve never looked at this website again. Turns out you can be rejected for a job which uses your work.

In using resources yourself, are there any books that have had an impact on you or your career?

I don’t have a lot of specific titles. Currently, I’m listening to more audiobooks, especially autobiographies. I like learning about history, what happened, how things were built, how things were before, how people interacted with each other and what was the outcome. Everyone had something interesting in their lives. I also read a lot of reportages, which gives me a history lesson and some insights —how people work, how the world works. That’s the most interesting part for me—how other parts of the world work beyond my backyard.

I’m very interested in the people outside of my expertise. I want to be open-minded about how people live and be respectful of them. And this also affects my work because it means I can design or build products for everyone.

Always in the back of my mind, I think things are not the universal truth just because I’m doing them that way. Other people do things another way, and they have valid reasons to work it a different way; I should at least listen to them or try to understand. This applies to the programming style—how I write code—because I think everyone is different.

I don’t believe there is one universal truth on how to write code. Of course, we have some guidelines but if you read someone’s code base, you think, Oh, it’s shit… because I didn’t write it. I try not to do this.

Even when you take your codebase from four years ago, right? You think, “Did I write this?”

My goal is to be respectful and try to embrace that. I may not agree with something, and I may discuss that, but I try to not be binary about it, thinking it is wrong because somebody else did it differently. It’s not wrong. Everyone had their reason behind the solution and constructs. I don’t necessarily have to pursue my idealistic point of view because there are reasons to do things differently and maybe I’m wrong after all.

You are a person who works from home. What is your take on this trend?

The biggest disadvantage of working remotely in Europe is the time-zone variance. Most IT tech remote jobs are in the United States. Living in the same timezone makes getting work done easier. The U.S. is a big country; you don’t have to live exactly in the Silicon Valley, for example, where the costs of living are high and not everyone wants to be. A lot of people are just moving out to other cities just to have a space to live and they work remotely.

Of course, a lot of people work remotely in Europe and then we work in our timezones. But it depends on the company.

The trend is to have more and more remote work. Google, for example, published a reporting tool that stated remote work is the future. But Google itself is not very famous for hiring remote workers. So something must change to make that big switch on a global scale. People have to trust more that remote setup is feasible in the same way a regular office is.

Many offices now have an open-concept. The majority of people dislike the open space. So why force people to go to the open space and not let them work remotely? It also offers flexibility in working setups. For instance, I show up in the morning at my desk and stay until 5 pm, so I’m virtually sitting next to my teammates. I’m just at a different location, but I’m there, working.

I also worked in the setup where the hours are more vague. It’s not that strict. I worked but the hours were not that important. So it depends on how the company is organized. I prefer to organize my own life. I’m aware of when I am the most focused. I know the hours when my productivity is the best, and I can build or schedule my day around that knowledge. So it lets me be the most productive for the project.

I have a family, and I have some duties as well. Working remotely allows me to be happier in family life. I have time to spend with my kids. I have time to do my parent obligations, and I have time for doing my job. It’s best for everyone. And I don’t have to commute. I still talk to my colleagues; I’m just a click away from seeing each other and discussing things. Today’s technology allows us to work remotely.

Company organization is important, too. You may feel out of the loop when you’re remote if you’re the only person working remotely, and everyone else is sitting in the same room. But if you’re organized in a way that the business has to be discussed on Slack or on a call, you don’t feel out of the loop because you see what everyone else sees.

Are there any particular practices that help you work remotely successfully?

My life has changed over time, so my rituals have changed as well. I start my day by walking my kids to school. Then I’m back and my colleagues have already started work, but I’m not ready to start. I’m doing breakfast and minor housework, which gives me the energy and the feeling that I already did something with my day. Chores are out of my head and I can focus on my work. Then I sit and evaluate how much time I need for tasks. It depends. But I know I will work until 3 pm. This is my time to work and no one bothers me. This is important.

Otherwise, especially if you work remotely, it’s very easy to get distracted. It’s important to set boundaries. My family understands that it is my working time. And after the work I just switch my mind and do all the other stuff in my life. And, later on, I’m back to work in the evening—like every programmer probably.

So I have the session during the day, then the break, and then back in the evening, because during the break I usually think about the problems I didn’t solve yet. And in the evening, I just solve it. If I don’t have an urgent task to finish I carve out time for learning the new technologies, mostly in the evening. I read some books or blog posts or watch the videos or build something just to keep up in the tech world.

How else do you set yourself up to be productive?

In my case, I like to change the environment; this is why I also like to work remotely because I can work in different places. I have a setup at home where I have a desk and a computer, but I also use a laptop, and I can go to a cafe or just a different place for one, two days to change the environment. I find it very refreshing if the scenery around me is just different, otherwise, it’s easy to get in the trap that you just sit in one room and just get bored or lose focus. I can meet some other people on the way, so that will help with my mental state as well.

Another tip is not to overwork yourself; it’s very easy to burnout. We need to manage the burnout because when the burnout comes, our productivity goes down and it’s not good for me or a company.

The fix for the burnout is, of course, change something. I change the scenery, but changing even the project or something that is not related to your job can help.

Preventing burnout is why I have these side projects; I have a lot of side projects and not all of them are published, but I experiment a lot. It helps me keep my sanity.

You’ve mentioned that it’s hard to keep up with new technologies; how do you stay current on new trends?

I have a strong phobia: fear of missing out. With so much going on, I don’t have time to keep up with everything. I wish I could, but it’s not possible; everything is too complex to keep up on top of everything. I try to just avoid some information; I know there’s a technology but it’s okay not to be an expert in this. I know there’s Kotlin, and I don’t know Kotlin, and I’m okay with that because I never need it.

If I would have a project or urge to use Kotlin, I would probably need a week or two to start using it. Of course, I will not be an expert from the first day, but it’s enough to get along with a new language. So then I would just allocate some resources to learn the technology and start using it. If I want to learn something, I just find time for it. Either it is in the evening or try to find a problem to solve in that technology because learning by using is the most effective way of learning I can find. I have a problem with reading the programming books from cover to cover. After a few pages I want to experiment with the material because reading is not enough. I can read, but I have to experiment.

In all your years of software development, is there something you wish someone had told you that you had to learn the hard way instead?

How to estimate the cost or time of a project. I was once fired because I didn’t estimate a project well. In the early days, I didn’t know that underestimating or overestimating is okay. I felt guilty. My first big problem was underestimating big, and it failed. I felt very bad but I shouldn’t have.

I should have accepted that. My colleague might estimate differently and can decide that the task will take two times more or less, and it’s okay. We can work on that.

When it comes to estimating, have you developed any techniques that help you?

I keep repeating in my head that I tend to underestimate so I try to just make the numbers bigger. I don’t have a reliable technique. When I work with a team, we usually have some techniques such as we take cards on and everyone puts a number and, eventually we agree on some value. This is very valuable. But being on your own is harder to estimate. Over time, I have more experience, and I’m more predictable with these estimates. That said experience would be the best tool to have the most accurate estimates. The less experienced the developer is, it will give the least accurate estimation because they are related to each other.

Beyond remote work, what is a current industry trend that you think is problematic?

I would say it’s our habit of abstractive everything. We build abstraction over abstraction, and everything is so complicated that nobody can see how things work. Ten years ago, a developer could handle the development environment by themselves. The knowledge of the programmer was enough to set up the build, configure the environment and start working. But now, you need to set up all the machinery behind the tests, behind the build system, behind the dockers, the virtualization. It’s complicated.

The solution people find is to build another abstraction over that. For instance, we had a Docker, which was fairly new technology and easy to follow. But it was not enough. We needed a Kubernetes. And nobody understood how the Kubernetes worked. A Kubernetes is not needed for the developer. It’s needed for the cluster, it’s needed on the server. If a developer today wants to build a website built on Node.js or similar, they will need a Docker container, and the developer will probably be asked to set up the Kubernetes just to deploy it to one of the cloud providers.

Building abstraction is particularly visible in the JavaScript world in all these frameworks on top of the frameworks, on top of the frameworks, and nobody any longer understands what’s going on under the hood. It happens in programming languages as well; C++ has become so complicated at this point that it’s very hard to start with it. It happens also with Swift. The new features are getting harder and harder to understand. I think this is the root of the problems we have. We do not know how it works anymore and we just do a patchwork. We don’t fix the real problem—we just add something to cover the real problem.

Is there a way to fix this problem?

Do not abstract early; start with simple tasks that solve your problem and then eventually abstract it. So if all you need is a Docker container, just stick with it. You don’t need a Kubernetes. The cloud provider shouldn’t force us to use all this machinery just to deploy an application. And as programmers, we shouldn’t start with the abstraction. We should start with the working solution and then abstract it.

“I don’t think everyone should transition to management because not everyone feels interested in doing it or is capable of doing it.”

For someone interested in helping solve these kinds of problems, do you see a need for people to transition into management?

I don’t think there is a need for a transition into management at all. The software industry has no promotion opportunities for programmers who want to remain in an engineering position. You start as a junior programmer and you become a senior programmer in two, three years. And then there is the ceiling.

If you want to get promoted at work you have to go into management because the company has nothing more to offer to you. It should not be like that. Not everyone has a predisposition and ability to be a manager or not everyone is interested in doing it. It’s a different kind of work. If the company has a choice, I definitely recommend creating a promotion path for software engineers that is not related to management.

It’s okay to be quasi-manager - a leader of the team. But strictly taking a management position is so different that we should not be forced to go into that direction. If you feel it’s good for you, go ahead; you will learn a lot of new stuff, but if you don’t feel it just don’t go there because you will be a bad manager.

I’m an educated manager, but I don’t feel that I want to work as a manager—at least now. I find myself better suited in a technical position or a smaller team, like a leader but not necessarily a manager. If you decide to be a manager, the best way is to learn from the other managers. School won’t give you the knowledge you need. Of course, you need at least basic academic knowledge, mostly about how people work, how teams work. But day-to-day work is different and comes with a lot of stress.

I really would love to live in a world where we don’t have to go to the management position and we have more steps other than junior software developer to senior software developer. It is limiting for us.

Marcin’s Recommendations

  • Swift Unwrapped podcast with JP Simard and Jesse Squires | spec.fm/podcasts/swift-unwrapped

  • Point-Free Swift video series | pointfree.co

  • Wise Guy: Lessons from a Life | Guy Kawasaki

  • The Emperor: Downfall of an Autocrat | Ryszard Kapuscinski

Have a technical question? Want to report a bug? You can ask questions and report bugs to the book authors in our official book forum here.

Have feedback to share about the online reading experience? If you have feedback about the UI, UX, highlighting, or other features of our online readers, you can send them to the design team with the form below:

© 2021 Razeware LLC