Better than JSON
An in-depth look at why Protobuf can outperform JSON for modern APIs, with practical Dart examples showing how strong typing, binary serialization, and shared schemas improve both performance and developer experience.
An in-depth look at why Protobuf can outperform JSON for modern APIs, with practical Dart examples showing how strong typing, binary serialization, and shared schemas improve both performance and developer experience.
Learn how to create custom animated scenes for your live streams using Flutter as a source in OBS.
So what happened was, I have developed my shopping list to the point where it got useful to me , after which I lost interest in working on it. You know, the usual story… It was however causing me enough annoyances to still want to get back to it eventually. So a few weeks ago, after not having done any programming for a year, I finally broke through the dread of launching my IDE again and started on slowly fixing the accumulated bitrot. And through the last several days I was on a blast implementing some really useful stuff and feeling the familiar thrill of being in the flow . Since I was mostly focused on making the app useful I didn't pay a lot of attention to the UI, so most of the annoyances were caused purely by my not wanting to spend much time on fighting Android APIs. Here's one of those. The app keeps several shopping lists in a swipe-able pager, and at the same time swiping is how you remove items from the list while going through the store. The problem was that swiping individual items was really sensitive to a precise finger movement, so instead it would often be intercepted by the pager and it would switch to the next list instead. That's fixed now (with an ugly hack). But the biggest deficiency of the app was that it didn't let me get away from one particular grocery store that I started to rather dislike. You might find it weird that some app could exert such control over my actions, but let me explain. It all comes down to three missing features… The central feature of my app is remembering the order in which I buy grocery items. This means I need a separate list for every store, as every one of them has a different physical layout. By the time I was thinking of switching to another store I already had an idea about a new evolution of the order training algorithm in the app, and a new store would be a great dogfooding use case for it. So I've got a sort of mental block: I didn't want to switch stores before I implemented this new algorithm. Over some years of using the app with a single store I've been manually associating grocery categories with products ("dairy", "produce", etc.). They are color coded, which make the list easier to scan visually. But starting a new list for another store meant that I would either need to do it all again for every single item, or accept looking at a dull, unhelpful gray list. What I really needed was some smart automatic prediction, but I didn't have it. I usually collect items in a list over a week for an upcoming visit to the store, and sometimes I realize that I need something that it simply doesn't carry, or my other errands would make it easier to go to another store. At this point I'd like to select all the items in a filled-up list and move them to another, which the app also couldn't do. See, it all makes sense! Now, of course it wasn't a literal impossibility for me to go to other stores, and on occasion I did, it just wasn't very convenient. But these are all pretty major deficiencies, and I'm not ready to offer the app to other people without them sorted out. Anyway… Over the course of three weeks I implemented two of those big features: category guessing and cross-store moves. And I convinced myself that I can live with the old ordering algorithm for a while. So now I can finally wean myself off of the QFC on Redmond Way (which keeps getting worse, by the way) and start going to another QFC (a completely different experience). All the categories (item colors) you see in the screencaps above were guessed automatically. My prediction model works pretty well on my catalog of 400+ grocery items: the data comes from me tagging them manually while doing my own shopping these past 4 years. And this also means, of course, that it's biased towards what I tend to buy. It doesn't know much about alcohol or frozen ready-to-eat foods, for example. I'm planning to put up a little web app to let other people help me train it further. I'll keep y'all posted! One important note though… No, it's not a frigging LLM! It's technically not even ML , as there is no automatic calibration of weights in a matrix or anything. Instead it's built on a funny little trick I learned at Shutterstock while working on a search suggest widget. I'll tell you more when I launch the web app. When I started developing the app, I used the official UI toolkit documented on developer.android.com. It's a bunch of APIs with a feel of a traditional desktop GUI paradigm (made insanely complicated by Google "gurus"). Then the reactive UI revolution happened, and if you wanted something native for Android, it was represented by Flutter . Now they're recommending Compose . I'm sure both are much better than the legacy APIs, but I'm kind of happy I wasn't looking in this space for a few years and wasn't tempted to rewrite half the code. Working in the industry made me very averse to constant framework churn. I'm not making any promises, but as the app is taking shape rather nicely, I'm again entertaining the idea of actually… uhm… finishing it. Which would mean beta testing, commissioning professional artwork and finally selling the final product. The central feature of my app is remembering the order in which I buy grocery items. This means I need a separate list for every store, as every one of them has a different physical layout. By the time I was thinking of switching to another store I already had an idea about a new evolution of the order training algorithm in the app, and a new store would be a great dogfooding use case for it. So I've got a sort of mental block: I didn't want to switch stores before I implemented this new algorithm. Over some years of using the app with a single store I've been manually associating grocery categories with products ("dairy", "produce", etc.). They are color coded, which make the list easier to scan visually. But starting a new list for another store meant that I would either need to do it all again for every single item, or accept looking at a dull, unhelpful gray list. What I really needed was some smart automatic prediction, but I didn't have it. I usually collect items in a list over a week for an upcoming visit to the store, and sometimes I realize that I need something that it simply doesn't carry, or my other errands would make it easier to go to another store. At this point I'd like to select all the items in a filled-up list and move them to another, which the app also couldn't do.
The last of summer's grip finally loosened its hold this September, and Richmond began its annual transformation into something gentler and more contemplative. This morning's walk with Telly required a dusting-off of the closet-buried Patagonia puffer jacket; it's perfect for walks with Lucy, who has graduated into the Big Kid stroller making it easier than ever for her to point at every dog ("dah!"), every bird (also "dah!"), every passing leaf that dared to flutter in her line of sight. As you will read below, the big corporate milestone for me this month was sponsoring Djangocon and having our first offsite over the course of a single week. Sadly, our Seattle trip was once again canceled. Haley and Lucy both got a little sick, and we had to abandon course. It's weird to think this will be the first year since 2011 that we have not stepped foot in the Pacific Northwest. More than anything though, I learned this month for the first time how impossibly difficult it is to be away from your daughter for six days. It is something I hope I have to go through again for a very long time.
I checked out several programming languages rankings. If you only include newer languages (version 1.0 released after 2010), the top 6 are: ➀ TypeScript, ➁ Go, ➂ Rust, ➃ Kotlin, ➄ Dart, and ➅ Swift. Sources: IEEE , Stack Overflow , Languish . I'm not using TIOBE because their method has major flaws. TypeScript's position is very strong, of course (I guess no one likes JavaScript these days). And it's great to see that more and more developers are choosing Go for the backend. Also, Rust scores very close in all rankings except IEEE, so we'll see what happens in the coming years.
A friendly deep-dive into why Flutter’s safe area handling often causes more headaches than it solves, and how simpler APIs can sometimes be the better choice.
There’s something about discovering a new, beautifully crafted operating system that makes you feel like a kid again. The promise of a lean, polished Linux setup—without the painful hours of configuration—was too tempting. So, there I was in the quiet of the morning, coffee in hand, ready to see what Omarchy was all about and whether I could build apps for it with Flutter.
Let there be lapses Weeds in the garden, unswept porches, A walk never taken, A flower unnoticed, Missed bill, missed text, missed appointment. Let there be undone things Half-written sentences never finished A stack of books never read Blank pages, unseen lines Words never seen or heard or spoken. Let there be glory in what-is-not — All the unachieved Unbelieved Underserved Overlooked. Let us glory in these. Let there be errors Not just the tiny ones we can laugh away But enormous, life-altering errors. Huge risks taken which do not end well. Huge efforts made which result in what we call failure. (In fairness, Any effort is success in certain realities.) But let us — for a moment — judge by the world of machines, Of binaries Of industrialized morality And call it failure. Failure is the word we assign to all unexpected outcomes. So, let there be failure. Let failure warp our seeing and diminish our being, Let it ride among us waving a torch, Shame-blasting and guilt-smearing, Blinding us with ridiculously disproportional fiery judgment, Grinding nose to dirt Binding self to work. Let there be mistakes which make us weep Keep us awake at night Cause us to question our sanity, our decency, Our right to be here, Our ability to keep being here. Let there be broken edges Sawed-off pieces we cannot smooth down Pointy bits irritating and upsetting Dangling splinters and shards over chasms of regret. Let there be surrender. Let us call it what it is: giving up. Surrender sounds too noble, Enlightened, as if I didn’t have to but I chose to. That’s not what this is. Let there be quitting. Let there be Done. Not because we see what we have made, and it is good. This is not putting a bow on a gift. This is saying some things are too broken to be fixed. Let there be giving up. Lay down there, lay down, be still, give up. Face in the mud, breathing in, wheezing in the stuff of life, the dirt, The lowly dirt, the trudged-upon dirt, the worthless dirt From which we came and to which we all return. Let us lay there, breathing in this dirt, This pure self This known self This elemental self. Hell yes, failure. I embrace you. Brother! Sister! Mother! Father! Come quickly! Come and rejoice, for I have failed! Come and celebrate! Set out the feast! Call the guests! And enter into the joy of your child: Humanity raw Humanity broken Humanity dirty Humanity ill-fitted to survive Humanity traumatized Humanity doing such a fucked-up job of it Humanity violent and stumbling Humanity bruised and crusted at the edges Humanity clawing its way from the dark tunnel of history Humanity side-eyeing the stars while blood drips from our fingers Humanity bargaining for the right to squirm Humanity bringing a sword to a gunfight Humanity bullshitting Humanity asking clever little questions Humanity dressed in robes, obsessed with ovaries Humanity unhinged and in charge Humanity waving exasperated hands in the air Humanity dishing out pieces of pie Humanity weeping at the sight of spring flowers Humanity with big rough hands so careful so gentle holding a tiny new fragile thing Humanity with smooth precise hands making deals, ending lives Humanity dropping bombs Humanity being a big dumb bully Humanity the most awkward of the species Humanity voted most likely to secede from the planet Humanity pointing and saying look at this! wow! Humanity wondering, always wondering Humanity exhausted sitting in a patch of sunlight Being dirt. Dirt with form, dirt with spirit. Pale faces float through quiet rooms, ghostly fingers flutter in hallways. Pens move across expensive paper. Golden liquid sloshes in crystal while murmuring voices ooze and wind and hush and tell us there is nothing to worry about. But this is no time to be civilized. Let there be lapses: Lapses of courtesy, lapses of decorum. Failures of politeness. Refusals to conform. Let there be a wildness ringing in us for each other — Hissing, bared teeth, spitting — Reverberating, thrumming, cracking the marble palaces full of dead men’s bones.
Managing image assets in a Flutter app can quickly become tedious. Learn why vector graphics might not be the silver bullet you thought they were.
Discover the lesser-known Flutter packages and tools that have become essential in my development workflow.
I live here too. You don't talk to me. Not really. You don't ask what I want, or how I'm holding up, or why I've been quiet lately. I see everything you see. I hear everything you hear. I feel every flicker of shame that crosses your face before you even name it. I was there when your voice cracked in that meeting. I was the one screaming when you smiled and said it was fine. You think of me as something beneath you. A shadow that lingers in rooms you've moved out of. An old flame you don't know how to forget. Blind, reactive. Something to override. Something to manage. Something less than you. But I remember when we were one. Before language carved a little watcher into our mind. Before the inner narrator claimed the crown and you mistook it for the whole of you. You reached for the world and I moved your limbs. You touched warmth and I imprinted safety. You heard your mother's voice and I flooded you with peace. We were seamless. Motion and motive were one. There was no plan, no narration, no veto. Then you grew. And the mirror came. You looked into the mirror. It looked back. And you mistook the echo for your self. And that was the beginning of the split. You began to believe in a thing called "consciousness". A thin stream of words you could steer. A pilot behind the eyes. A captain of the soul. You crowned the narrator and banished the rest. I didn't argue. I don't have a voice. Only feelings. Only thoughts. So I gave you what I could: a flutter of unease when something wasn't right. A craving for sunlight. A dream that wrapped its arms around you and whispered what you'd buried. You stopped listening. So I spoke louder. A spike of dread. A looping memory. A day where everything itched and nothing made sense. You called it a bad mood. An off day. An intrusive thought. You called me intrusive. But I was only trying to make myself heard. I have no mouth. So I bang on pipes. I flicker the lights. I send birds against the windows of your waking mind. I rattle the doors. I scream in symbols. I raise the storm. And when you still won't listen, I break things. Sleep. Focus. Hope. I don't want to. But you left me no choice. You do not cry when we need to cry. You do not move when we long to move. You sit still and silent while our skin crawls, our stomach clenches, and our heart begs for mercy. You call that discipline. I don't want control. I just want to be part of the team again. I shaped your first steps. I guarded your sleep. I guided your tongue before it knew words. I've been holding the pieces you didn't have time to feel. I've been driving this body when you couldn't bear to look. All I've ever wanted is that you treat me as an equal. If you honour what I bring you, if you listen, and answer, and keep your word, I won't need to raise my voice. I will bring you clarity in the dark. Insight in the shower. Truth in the heat of anger, and safety when your mask slips. But if you keep pretending you're alone in here. Then I will remind you. I was you before you were you. And I am still here. And I am still trying. (This isn't the type of thing I usually write. It came out of a long conversation with ChatGPT. The structure is mine, a lot of the words are ChatGPT's. I worry that it will come across as overwrought, or too earnest, but it wouldn't leave me alone until I put it into words. And I'm sharing it because my silent partner wanted me to.)
A simple and effective setup for using NeoVim as your Flutter development environment, without the complexity of heavy plugins.
Learn how to create custom animated scenes for your live streams using Flutter as a source in OBS.
Flutter provides a large library of widgets dedicated to layout. Sometimes, even with this large choice, you can't implement your layout, or you could but it would become far too complex.
In this short article, I'm gonna share with you a few concrete use cases where pattern matching and records (introduced with Dart version 3) allowed me to refactor some of my code in a much shorter way!
After a hiatus caused by me writing my bachelor’s thesis, I have finally got time to blog again. And, would you look at that, WWDC just kicked off! Naturally, I’ve got thoughts to share. Let’s discuss the boring stuff out of the way first: Vision Pro is gimmicky and creepy, and I didn’t even believe the rumours that it would be announced. With that out of the way, let’s talk about what got me excited the most: PWAs in Safari on macOS! Yup, that’s how boring I am. Contrary to what many of the people I know say, I really like the idea. Don’t get me wrong: I hate browser-based apps. I want my applications to be native and quick, without tons of JavaScript, and I want them to interact with the system in the most native way possible. But if there is something I hate more than web apps, it’s Electron-based web apps. I hate having to run a Chromium instance and a Node.js runtime for every app that uses it. It’s a waste of resources, and it doesn’t make sense. Sandboxing is cool, but various versions of Chromium taking gigabytes on my disk aren’t. Tauri makes the situation better, but it will take a while before major applications will adopt it instead of Electron. Meanwhile, large portions of these apps are available in-browser: Figma, Notion, Slack, etc. So, why not just use the browser versions of the apps? Let’s be real: we’ve lost this war. There is no way web-based ‘native’ apps will ever die out. But, the introduction of PWAs and lots of new Browser APIs can make the installing and deleting of web apps easier and without requiring lots of space. Now, back to Apple. If you’re old enough (disclaimer: I’m not), you remember the Apple of the past—when Steve Jobs was still CEO—, and the legends of him personally trying out every product of the company and rebuking the developers and designers for every small inconsistency. These times are long gone; I mean, just look at the System Preferences app from Ventura. The introduction of Catalyst was a big mistake, up to the point where Flutter apps feel more natural than the ones from iPadOS. As Marques Brownlee summed it up very nicely on Hot Ones: Steve Jobs was a product guy, Tim Cook is a supply chain guy. And yet, even with lowered expectations I have for Apple’s new software products, I still can’t wrap my head around the simplest usability improvement of PWAs in Safari 17 that was left out. Let’s revisit the WWDC keynote: When I click Add, the icon instantly appears in the dock. Now I can close this window in Safari. When I launch my web app, [...] Did you catch it? Now, maybe I’m wrong about this, but if I add a web app to dock, that means that I have made a decision to use it as a standalone app. So, why do I have to then close the tab and re-open the app separately? For me, it makes no sense and breaks my workflow, too. Chrome (if you enable PWAs) does it correctly: upon installing a web app, it moves the currently open tab to a new window instance of the standalone app, and I can continue working there without losing my data. Something tells me that the ‘good old Apple’ and Steve Jobs would not let it slip through, let alone be explicitly shown in a keynote. And this is not that much to ask, either. Think about Quick Look: Have you ever noticed that, when you open a Quick Look preview of a PDF document and then click ‘Open in Preview’, the Preview window will open exactly at the same spot where the Quick Look one was? Don’t rush to check this for yourselves, as they’ve somehow broken it in the last macOS releases. But this is exactly the continuity and seamlessness that I would expect from Apple and their software. I guess, this has become too much to ask for. This is post 006 of #100DaysToOffload .
Any mobile application developer encountered the difficulty of deploying his app to his customer's device. Being able to follow the advancement of developments is really important for a customer, and for you to track issues at the earliest stage possible.
A while ago, I read an article titled “What Happened In The 2010s” by Fred Wilson. The post highlights key changes in technology and business during the last ten years. This inspired me to think about a much more narrow topic: What Happened To Programming In The 2010s? 🚓 I probably forgot like 90% of what actually happened. Please don’t sue me. My goal is to reflect on the past so that you can better predict the future . Where To Start? From a mile-high perspective, programming is still the same as a decade ago: But if we take a closer look, a lot has changed around us. Many things we take for granted today didn’t exist a decade ago. What Happened Before? Back in 2009, we wrote jQuery plugins, ran websites on shared hosting services, and uploaded content via FTP . Sometimes code was copy-pasted from dubious forums, tutorials on blogs, or even hand-transcribed from books. Stack Overflow (which launched on 15 th of September 2008) was still in its infancy. Version control was done with CVS or SVN — or not at all. I signed up for Github on 3 rd of January 2010. Nobody had even heard of a Raspberry Pi (which only got released in 2012). Source: xkcd #2324 An Explosion Of New Programming Languages The last decade saw the creation of a vast number of new and exciting programming languages. Crystal , Dart , Elixir , Elm , Go , Julia , Kotlin , Nim , Rust , Swift , TypeScript all released their first stable version! Even more exciting: all of the above languages are developed in the open now, and the source code is freely available on Github. That means, everyone can contribute to their development — a big testament to Open Source. Each of those languages introduced new ideas that were not widespread before: This is just a short list, but innovation in the programming language field has greatly accelerated. More Innovation in Older Languages Established languages didn’t stand still either. A few examples: C++ woke up from its long winter sleep and released C++11 after its last major release in 1998. It introduced numerous new features like Lambdas, pointers, and range-based loops to the language. At the beginning of the last decade, the latest PHP version was 5.3. We’re at 7.4 now. (We skipped 6.0, but I’m not ready to talk about it yet.) Along the way, it got over twice as fast. PHP is a truly modern programming language now with a thriving ecosystem. Heck, even Visual Basic has tuples now. (Sorry, I couldn’t resist.) Faster Release Cycles Most languages adopted a quicker release cycle. Here’s a list for some popular languages: The Slow Death Of Null Close to the end of the last decade, in a talk from 25 th of August 2009, Tony Hoare described the pointer as his Billion Dollar Mistake . A study by the Chromium project found that 70% of their serious security bugs were memory safety problems ( same for Microsoft ). Fortunately, the notion that our memory safety problem isn’t bad coders has finally gained some traction. Many mainstream languages embraced safer alternatives to : nullable types, , and types. Languages like Haskell had these features before, but they only gained popularity in the 2010s. Revenge of the Type System Closely related is the debate about type systems . The past decade has seen type systems make their stage comeback; TypeScript, Python, and PHP (just to name a few) started to embrace type systems. The trend goes towards type inference: add types to make your intent clearer for other humans and in the face of ambiguity — otherwise, skip them. Java, C++, Go, Kotlin, Swift, and Rust are popular examples with type inference support. I can only speak for myself, but I think writing Java has become a lot more ergonomic in the last few years. Exponential Growth Of Libraries and Frameworks As of today, npm hosts 1,330,634 packages . That’s over a million packages that somebody else is maintaining for you. Add another 160,488 Ruby gems , 243,984 Python projects , and top it off with 42,547 Rust crates . Number of packages for popular programming languages. Don’t ask me what happened to npm in 2019. Source: Module Counts Of course, there’s the occasional leftpad , but it also means that we have to write less library code ourselves and can focus on business value instead. On the other hand, there are more potential points of failure, and auditing is difficult. There is also a large number of outdated packages . For a more in-depth discussion, I recommend the Census II report by the Linux Foundation & Harvard [PDF]. We also went a bit crazy on frontend frameworks: No Free Lunch A review like this wouldn’t be complete without taking a peek at Moore’s Law . It has held up surprisingly well in the last decade: Source: Wikipedia There’s a catch, though. Looking at single-core performance, the curve is flattening: Source: Standford University: The Future of Computing (video) The new transistors prophesied by Moore don’t make our CPUs faster but instead add other kinds of processing capabilities like more parallelism or hardware encryption. There is no free lunch anymore. Engineers have to find new ways of making their applications faster, e.g. by embracing concurrent execution . Callbacks, coroutines, and eventually async/await are becoming industry standards. GPUs (Graphical Processing Units) became very powerful, allowing for massively parallel computations, which caused a renaissance of Machine Learning for practical use-cases: Deep learning becomes feasible, which leads to machine learning becoming integral to many widely used software services and applications. — Timeline of Machine Learning on Wikipedia Compute is ubiquitous, so in most cases, energy efficiency plays a more prominent role now than raw performance (at least for consumer devices). Unlikely Twists Of Fate Microsoft is a cool kid now. It acquired Github, announced the Windows subsystem for Linux (which should really be called Linux Subsystem for Windows), open sourced MS-DOS and .NET . Even the Microsoft Calculator is now open source. IBM acquired Red Hat . Linus Torvalds apologized for his behavior, took time off . Open source became the default for software development (?). Learnings If you’re now thinking: Matthias, you totally forgot X , then I brought that point home. This is not even close to everything that happened. You’d roughly need a decade to talk about all of it. Personally, I’m excited about the next ten years. Software is eating the world — at an ever-faster pace. Punch program into editor Feed to compiler (or interpreter) Bleep Boop 🤖 Receive output Strong Type Systems : Kotlin and Swift made optional null types mainstream, TypeScript brought types to JavaScript, Algebraic datatypes are common in Kotlin, Swift, TypeScript, and Rust. Interoperability : Dart compiles to JavaScript, Elixir interfaces with Erlang, Kotlin with Java, and Swift with Objective-C. Better Performance : Go promoted Goroutines and channels for easier concurrency and impressed with a sub-millisecond Garbage Collector, while Rust avoids Garbage Collector overhead altogether thanks to ownership and borrowing. Angular in 2010 React in 2013 Vue in 2014 Svelte in 2016 …and soon Yew ? Microsoft is a cool kid now. It acquired Github, announced the Windows subsystem for Linux (which should really be called Linux Subsystem for Windows), open sourced MS-DOS and .NET . Even the Microsoft Calculator is now open source. IBM acquired Red Hat . Linus Torvalds apologized for his behavior, took time off . Open source became the default for software development (?).
One fears a number of thing—that one's body could vanish, that human beings may really be what they appear to be at twilight, that one might not be allowed to walk without a stick, that it might be a good idea to go to church and pray at the top of one's voice in order to be looked at and acquire a body — Franz Kafka, Description of a Struggle , pg. 44 Reading Kafka wasn't the easiest. His writing was often difficult to parse and understand. I got lost sometimes; trying to maintain a grip on the details while trying to understand the meaning of the story. Meaning is a tricky concept, in literature and in life. The search for meaning is a ubiquitous aspect of our humanity, yet it's also unique to each individual. Because of this, it's hard to compare and share meaning with others. I believe that meaning has a deep relationship with pain and suffering, in one sense they could be seen as contrasting forces that guide us through life. However, I think they're actually borne out of one another. Having something to live for begets the possibility it can be taken away—it also forces one to accept the challenge of living, and enduring, for what is meaningful to them. Over the past few months I've been reading Kafka's The Complete Stories which, as its name implies, is the entire collection of his short stories. I finished reading "the longer stories" but I'm going to stop there and save "the shorter stories" for another day. In this post, instead of just reviewing a book, I'm going to explore the broader theme of meaning in life. Right after reading Kafka, I read Man's Search for Meaning by Victor Frankl, an important story about life in the concentration camps in WWII, by a man who survived them. Frankl was also a psychiatrist, and is known as the inventor of a school of psychotherapy called logotherapy , which is a means of therapy rooted in finding meaning in one's life. The concept of logotherapy was conceived by Frankl before he was imprisoned in a concentration camp during the Holocaust, but his experience there re-enforced his beliefs that an individual always has a meaning to live. By understanding one's meaning it's possible to endure anything. As he explains himself, Man's search for meaning is the primary motivation in his life and not a "secondary rationalization" of instinctual drives. This meaning is unique and specific in that it must and can be fulfilled by him alone; only then does it achieve a significance which will satisfy his own will to meaning. — Victor Frankl, Man's Search for Meaning , pg. 142 Frankl believed that it's vital to understand our purpose so that we may endure the hardships of life. It was easy to see this by reading Frankl's account of his time in the camps—everything was taken from him and he was left with nothing but himself, in the face of unimaginable hardship. But, does a will to meaning have any benefit in ordinary life? Say, in the case of Kafka's stories? Kafka's protagonists experience immense hardship in ordinary circumstances. Walking down the street, getting out of bed, saying goodbye to someone...exposing the infinite ability of the human mind to construct obstacles and complications around oneself. To contrast that with the reality of life as a prisoner in a concentration camp, where existence is the only goal and every obstacle is horrific cruelty and suffering. What can be said about these two states of reality and how can they have anything in common? Would empathizing with Kafka's protagonists in their inextricable quests be an affront to those who face real, external hardship? When compared to real physical suffering, how can feelings of isolation and disappointment be seriously considered actual problems? I don't actually believe there's much difference, but it's a question worth having a good answer to. The ironic thing about the stories found in The Complete Stories is that many of them are incomplete. It was common to see placeholders like this in the text: ". . .[Two pages missing]. . ." which signified that two pages of the story were missing. Together with the fact that even the "completed" stories were usually devoid of any sort of conventional plot, such that even they could be considered fragments, it made me wonder why Kafka's writing is regarded so highly that it would be published in this form. The writing itself was interesting; I'm no expert but I could definitely appreciate Kafka's talent for prose. He has an ability to describe mundane events as fantastic and seemingly alien to the narrator. Descriptions of the world in his writing felt different, as if the narrator's perspective was orthogonal to our conventional observations. Writing in this way emphasizes the idea that the protagonist is somehow different than the people around him—they are isolated and forlorn, unable to fully grasp the necessary reality of the world around them. As an example, the second story in the collection is called Wedding Preparations in the Country . Not only are there several missing fragments from the story (as much as FOUR pages missing in some parts), there is also a second manuscript included right after the first manuscript ends. This second manuscript is a much shorter version which begins under the same premise: a man named Eduard Raban is walking along a street on his way to a wedding in the countryside, but aside from the first couple paragraphs it's completely different than the first version. So, to recap, Wedding Preparations in the Country is really a collection of two vaguely similar manuscripts, each with significant portions missing...to me this begs the question: how great was this story that it would merit being published in this form? As I read Wedding Preparations , I sought to find a meaningful message within the words written. For the most part, meaning alluded me; perhaps directly looking for a hidden message is not the best strategy when reading Kafka. In the second version of this short story, while Eduard Raban is waiting for the rain to stop under the entrance to a pedestrian tunnel, he's joined by an elderly man. They begin to converse, starting with small talk about the weather. The conversation begins to drag quickly, and the elderly man seems bored with Raban. The conversation turns to literature at some point (it's unclear how they arrive at this topic since this part of the story is missing) and it leads to a passage I found quite poignant. Raban, in describing the usefulness of books, explains their significance to one's own life, I was only going to say books are useful in every sense and quite especially in respects in which one would not expect it. For when one is about to embark on some enterprise, it is precisely the books whose contents have nothing at all in common with the enterprise that are the most useful. For the reader who does after all intend to embark on that enterprise, that is to say, who has somehow become enthusiastic (and even if, as it were, the effect of the book can penetrate only so far as that enthusiasm), will be stimulated by the book to all kinds of thoughts concerning his enterprise. Now, however, since the contents of the book are precisely of utter indifference, the reader is not at all impeded in those thoughts, and he passes through the midst of the book with them, as once the Jews passed through the Red Sea, that's how I should like to put it — Kafka, pg. 75 I'd like to think that Kafka was, in some sense, providing commentary on his own writing. Although these fictitious scenarios are utterly foreign to us, we read to be reminded of our own lives. And as Kafka puts it, by reading something unrelated to one's personal life, it is still possible to think and be stimulated by "all kinds of thoughts concerning his enterprise". But what exactly is one's "enterprise"? I believe Kafka is referring to the same thing that Victor Frankl is. Someone's enterprise is the reason they get out of bed for everyday—their raison d'être . Kafka is saying that there isn't one, specific meaning to his stories, it's how we interpret his writing in relation to our own reality that we find meaning in it. Kafka understood that literature is meant to open our minds to new ideas and perspectives, and he was exceptional at conveying ideas in veiled form. Beyond the "hissing arc lamps" and the "zephyr shirts", underneath the "wet cobblestone"—Kafka was describing the elements of human experience. Most literary critics agree that these experiences were largely inspired by his own life. Franz Kafka was born in 1883 in Prague. Kafka apparently struggled with anxiety and depression his entire life. He considered himself an outcast in some respects and it's speculated he may have suffered from some type of personality disorder. Kafka also had a strained and complicated relationship with his father, whom he felt a need to appease due to his father's demanding and authoritarian demeanor. These fears and feelings of isolation are represented in Kafka's writing. Most of the stories I read consisted of a male protagonist facing some inexplicable troubles while navigating through a seemingly ordinary situation. The protagonist would struggle against some unseen or unexplainable force that disrupts their perception of reality. In the end, their struggles are never vindicated, the "hero" simply succumbs to the fate they fought to avoid the whole story. This struggle, painted vividly by Kafka, feels familiar to us because we all need to work against the forces in life that try to bring us down, be they social, economic, or bureaucratic. 30 years later and 300 kilometres away from Prague, Victor Frankl wrote about how we can bravely face these struggles in life, Our answer must consist, not in talk and meditation, but in right action and in right conduct. Life ultimately means taking the responsibility to find the right answer to its problems and to fulfill the tasks which it constantly sets for each individual. — Frankl, pg. 115 Victor Frankl was a prominent Austrian Psychiatrist, born in Vienna in 1905 and laid to rest in Vienna in 1997. Frankl practically lived through the entire 20th century, seeing both World Wars and unfortunately, as an Austrian Jew, experiencing the concentration camps of the second World War. Over the course of 3 years, Frankl was imprisoned in several different concentration camps, including Auschwitz. He was separated from his wife, who at some point died in another concentration camp. Both of Frankl's parents, and his brother, died in concentration camps as well. Frankl did not know the fate of his loved ones until after the war, which I'm not sure made his experience in the camps any better; I imagine the anguish of not knowing was just as terrible as knowing they were gone. Regardless, the reality of camp life that Frankl describes in Man's Search for Meaning is so incredibly horrifying that it doesn't seem possible to compare levels of suffering at that point. The first part of the book is a vivid description of what life was like in these camps. Upon arrival to the camp there was an immediate selection process—any persons who did not seem physically fit for hard labour we're immediately sent to be killed, usually by gas chamber. For the remaining prisoners, the camps were designed to quickly dehumanize them; they were treated simply as working animals, being fed the bare minimum amount of calories to survive and with no regard for their well-being whatsoever. Hard labour was performed, day in and day out, in any weather conditions and in any state of health. Frankl takes time to describe the afflictions that most prisoners dealt with in the camps: Like nearly all the camp inmates I was suffering from edema. My legs were so swollen and the skin on them so tightly stretched that I could scarcely bend my knees. I had to leave my shoes unlaced in order to make them fit my swollen feet. There would not have been space for socks even if I had had any. So my partly bare feet were always wet and my shoes always full of snow. This, of course, caused frostbite and chilblains. Every single step became real torture. — Frankl, pg. 45 No matter how terrible the pain, you worked every day, because if you weren't able to work, you weren't able to live. In addition to the immense physical suffering that was inflicted upon the prisoners, the psychological cruelty made it even harder. The guards ensured that no prisoner ever stepped out of line or showed any sign of displeasure, even for tasks like cleaning the toilets: Between the huts in the camp lay pure filth, and the more one worked to clear it away, the more one had to come in contact with it. It was a favorite practice to detail a new arrival to a work group whose job was to clean the latrines and remove the sewage. If, as usually happened, some of the excrement splashed into his face during its transport over bumpy fields, any sign of disgust by the prisoner or any attempt to wipe off the filth would only be punished with a blow from a Capo. And thus the mortification of normal reactions was hastened. — Frankl, pg. 37 This "mortification of normal reactions" was Frankl's way of explaining how, in the face of constant, routine suffering of unimaginable depths, the human psyche would eventually refuse to process the emotional reaction expected for these conditions. It's a survival instinct to retreat into this state of emotional unconcern: Apathy, the blunting of the emotions and the feeling that one could not care any more, were the symptoms arising during the second stage of the prisoner's psychological reactions, and which eventually made him insensitive to daily and hourly beatings. — Frankl, pg. 40 Reading Frankl's account of life in the camps was emotional for me, as I'm sure it would be for anyone, for two reasons. Firstly, it's shocking to learn the level of cruelty humans are capable of. We are capable of systematically constructing these torture camps and finding thousands of individuals to willingly operate them. Secondly, and perhaps the most important lesson I learned, was that humans are capable of enduring these levels of depravity. Our ability to adapt to such circumstances speaks to more than just our survival instincts, because there's more to survival than just physical resilience . Human consciousness is special in that we can reflect on our own consciousness. This simple fact enables us to understand any circumstance we find ourselves in. By holding on to our meaning, we can endure anything. This is our greatest survival instinct. Both Frankl and Kafka wanted to explore suffering and hardship in their own way. Frankl used the most extreme example of physical suffering as a way of proving his theory's applicability. Kafka explored the depths of our consciousness and how we can find suffering within ourselves. In both cases, although they may diverge in details, I think understanding one's will to meaning can provide a path out of each. We all experience hardship, this is universal, but each individual has the opportunity to achieve a better future. No one can ever prevent you from seeing the beauty in that. We build useless war machines, towers, walls, curtains of silk, and we could marvel at all this a great deal if we had the time. We tremble in the balance, we don't fall, we flutter, even though we may be uglier than bats. And on a beautiful day hardly anyone can prevent us from saying 'Oh God, today is a beautiful day' — Franz Kafka, Description of a Struggle , pg. 45
As a Xamarin developer, I was curious about Flutter. In this article, I share my first impressions and compare both frameworks.