Cost Reasoning

Cost seems to be an inseparable part of our lives. We look at it when we buy stuff, pay taxes, purchase services. But it takes a bit of a backseat when it comes to computer science—especially during the academic years. It comes back once we join the workforce, though it often takes on an elusive form — at least in my IT experience. It doesn’t come naturally; it’s effectively forced on us through communication with the business side. To me, “cost” is so ill-defined that it’s often thrown around for emphasis rather than as something more or less concrete.

Even in personal life, cost is tricky. Let’s say a pen costs $1. Is that the real cost? Do we just buy it and move on? Well, here’s how I see it: the pen costs $1 + $0.13 (13% sales tax) = $1.13. Now factor in income tax—say, 30%—and the cost becomes $1.13 / 0.7 = $1.61 (rounded). So once we factor in both sales and income taxes, the cost jumps by about 61.4% from the sticker price. And that doesn’t even include the cost of earning that money in the first place. Do you drive to work? How long does it take? Do you pay for insurance? Is your car depreciating? If you run a business, you might write those expenses off—but if you’re an employee, you just eat the cost. By the time all’s said and done, you’re looking at a markup of over 61.4%—and that’s before environmental fees, dealer fees, or whatever else sneaks in at checkout. And finally: how much time does it actually take to make that money?

Now to the IT world. I remember a while back when agile cards (or T-shirts and such) were a popular tool to estimate work for a sprint. At some point, that idea took a dive—never to be seen again. Why? I believe it comes down to two things: inaccuracy and waste. You end up estimating in points that are hit or miss (most of the time, a miss). Then managers try to make sense of those points for that particular team and convert points to time. Eventually, they give up and just ask for time estimates instead. Next, all of that gets applied to project estimates, and finally, to the budget. Eventually, the whole exercise was written off as useless. Why waste time estimating when it doesn’t improve accuracy? It just ends up wasting time for no benefit—or in other words, increasing cost.

Next up: software craft. How do we reason about the cost of code? Do we think about execution cost? Development cost? What about refactoring, adding features, maintenance, or security upgrades and dependencies? Do we factor in code correctness? Recently I was part of an architectural decision-making process. We had two paths: develop a new feature using an old dependency or a new one. Let’s break them down.

Using a new dependency: faster, easier development, with future support. Risk: the new feature might not integrate easily with the legacy system.

Using the old dependency: easier integration. Risk: slower development, no support, potential security issues. And when the old system is retired, we’ll either have to rewrite everything or keep dragging around old dependency — bringing all the baggage with it.

Moreover, we know the old system is set to be retired within the next six months, while new feature delivery is targeted for the next twelve. Just from the timeline alone, it becomes painfully obvious that the risks of supporting the old system are already mitigated. From a development cost perspective, it makes far more sense to adopt the new dependency. Yet the issue keeps getting debated—because, well, “nobody gets fired for buying IBM.” The essential argument is that writing new feature code based on the old dependency will work “everywhere,” so the deadline will be met, and we’ll all be safe—no risk. But what about cost? It would take three times as long using the old dependency. What about future cost—what if we have to rewrite it later? How about support—dragging around an old, unsupported dependency isn’t free. And do we ever factor in security risks? How much will that cost? Yeah, at the beginning of the day, if we don’t consider cost—or worse, don’t communicate it to the business—we might feel “safe.” But the business can count. And usually, better than IT. So by the end of the day, cost questions will creep in—and by that point, no one will be safe.

The cost of software development is anything but trivial—it depends on a variety of factors. Maybe it’s a throwaway project. In that case, we can skip tests, write a mess of code, use bubble sort, and slap it all together just to get it running as quickly as possible. But should we do the same for a legacy project? What about a current production system? Do we write clean code so it pays off with the next feature set—or just duct-tape things together and leave it for someone else to debug at 3:00 a.m. on a Sunday during a production emergency? I believe a developer can make any choice—as long as it’s a conscious one, based on cost considerations. And to make that kind of decision, cost must be learned, understood, and applied—as part of both software education and everyday development.

Norbert’s Gambit

Recently, I learned about Norbert’s Gambit, and it seems like a really nice way to avoid paying currency conversion fees. You still end up paying something, but depending on the amount you’re converting, the fees can be pretty small — I’ll illustrate this later.

So what is Norbert’s Gambit? Norbert’s Gambit is a strategy used to convert Canadian dollars (CAD) to U.S. dollars (USD) (or vice versa) by buying and selling interlisted stocks or ETFs — stocks that trade on both Canadian and U.S. exchanges. The idea is simple:

  1. Buy the stock in CAD on the Canadian exchange.
  2. Transfer the stock to the U.S. exchange.
  3. Sell the stock there in USD — effectively converting your money with minimal fees.

As I mentioned, this method helps avoid conversion fees that banks, brokers, and private exchanges charge. Here’s what I’ve seen:

  • Banks: Typically take 3–5 cents per dollar (3–5%).
  • Brokers (InvestorLine in my case): Around 2 cents per dollar (2%).
  • Private exchanges near me: About 1 cent per dollar (1%).

Fees of 1–5 cents per dollar might not seem like much at first, but they add up fast—especially for larger amounts. For example, if you exchange $10,000 CAD, the fees would be ~$300–$500 for bank, ~$200 for broker and ~$100 for private exchange. Now think about your entire retirement fund — suddenly, those fees don’t look so small.

Norbert’s Gambit isn’t completely free. Here’s what you still have to factor in:

  1. Trading fees: InvestorLine charges $10 per trade, so buying and selling costs $20 total.
  2. Stock price movement: Prices fluctuate, so there’s a chance the value changes before you sell.
  3. Market spread: The difference between bid and ask prices can result in a small loss.

That said, InvestorLine does automatic online transfers, so there’s no need to call anyone or wait a day — minimizing the risk of price movement. To test it out, I ran a small experiment:

  • Bought 1 share of BMO:CA for $138.17 CAD
  • Sold 1 share of BMO:US for $95.8516 USD
  • Effective exchange rate: 0.694
  • Market exchange rate at the time: 0.693

I actually gained about 10 cents per exchange, but that was just luck due to market fluctuations going my way. Now let’s extrapolate and assume things didn’t go in my favor. If I exchanged $13,817 CAD, I’d buy 100 shares of BMO:CA and sell them in USD at an effective exchange rate of 0.692 instead of the market rate of 0.693.

  • Norbert’s Gambit: 0.692 × $13,817 = $9,561.364 USD
  • Official exchange rate: 0.693 × $13,817 = $9,575.181 USD
  • Loss due to the exchange rate difference: $9,575.181 − $9,561.364= $13.817 USD


So, I lost $13.82 USD due to the slightly market volatility. If I had used a private exchange instead (charging 1 cent per dollar), the fees would have been: $9,575.181 –  (13817 * 0.683) = $138.17 USD. That’s 10 times more expensive than my $13.82 USD loss from Norbert’s Gambit! Now, let’s add in the trading fees: 20 USD + 13.82 USD (loss) = $33.82 USD total cost. Even after including the trading commission, the total cost is still way lower than the $138.17 fee from the private exchange.

In my mind, Norbert’s Gambit is an awesome strategy, especially considering that Canadian investors have to exchange currency at least twice in their lifetime — once to invest and again to cash out for retirement. This means Norbert’s Gambit can save Canadians around 2% on foreign investments.

3 Years Since the Full-Scale Invasion of Ukraine

It’s been three years of war, and it keeps on going. My naïveté is slowly being replaced with cynicism. Last year, I hoped the West would pull itself together—providing much more support to Ukraine while applying greater economic pressure on the other side. While there have been some increases, once again, it’s been too slow, too little, and in some cases too late.

To some degree, I’ve started to feel like the West is trying to preserve the aggressor. Yes, save the murderer—because otherwise, someone would have to deal with the fallout?! It’s astounding to contemplate such a scenario. It feels like there is no justice, no honor—it’s all about preserving the status quo. And by the way, the same seems to be happening in Israel. After the horrendous October 7th attack, somehow Israel is labeled the bad guy.

If you attack, kill, or kidnap—you are the aggressor, the murderer. It should be plain and simple. Yet, this concept seems too difficult for some to grasp—or so it seems. Another concept that apparently baffles people is democracy, liberalism, and freedom. Some places have them; others don’t. Ukraine and Israel have them. And the opposing sides? Let’s see: one place has had the same “president” for over 24 years—marked by repression and political killings. The other hasn’t held elections in the last 19 years, and political opposition tends to end up flying out of windows shortly after speaking up. But again, this concept seems too hard to grasp. Who are the bad guys in this situation? Somehow, we’ve bent the truth so far that Ukraine supposedly started the war and Israel is somehow the aggressor.

I’m tired of watching these horrific events unfold, but I don’t dare look away. It’s a reminder of how people operate, how disinformation spreads, and how evil prevails. But we cannot give up. We must keep fighting—keep going until the very end.

Source

Slava Ukraini.

Inequality and Risk

I’ve been slowly making my way through Paul Graham’s essays, and for the most part, I’ve been enjoying the journey. Recently, I came across his essay, “Inequality and Risk,” and it gave me a few thoughts. As Paul said: “The word ‘essay’ comes from the French verb essayer, which means ‘to try’”, so let me try.

“Like many startup founders, I did it to get rich. But not because I wanted to buy expensive things. What I wanted was security. I wanted to make enough money that I didn’t have to worry about money. If I’d been forbidden to make enough from a startup to do this, I would have sought security by some other means: for example, by going to work for a big, stable organization from which it would be hard to get fired. Instead of busting my ass in a startup, I would have tried to get a nice, low-stress job at a big research lab, or tenure at a university.

That’s what everyone does in societies where risk isn’t rewarded. If you can’t ensure your own security, the next best thing is to make a nest for yourself in some large organization where your status depends mostly on seniority.”

Paul Graham

I understand that startups are incredibly risky—it’s a fact. People investing in startups also take the same risk as founders, or perhaps even more. So if the reward isn’t worth it, then investment—and therefore startups—won’t be worth it, which means development stagnates. I agree with this argument.

But here’s my question: does progress and development only happen with big rewards? Paul says it isn’t about the money but about security. There are different ways to achieve security: one way is to make lots of money, and another is to get a secure job—a low-risk, low-stress position that’s stable and reliable. So if there’s no risk and no reward, does that mean all brilliant minds would gravitate toward secure jobs in big companies, research institutions, or government?

What about Albert Einstein? He made it. Now, for the sake of argument, what if security were already provided? Let’s wave a magic wand and imagine you receive enough money to live well. Wouldn’t you then want to dedicate yourself to what you do best—perhaps to development and innovation? Maybe one could be driven purely by a desire to innovate, rather than by the promise of big rewards or security. Not everyone becomes a doctor just to make loads of money. Some people genuinely want to help others and improve lives. Shouldn’t pure curiosity and the desire to improve be enough motivation?

I get it—there’s no magic wand. There’s resource competition. Effectively, this is all about security and resources: if you don’t secure yours, someone else will. It’s funny (and sobering) how quickly the argument can devolve back to a Stone Age-level mentality—it’s either you or them. But that seems to be what Paul is describing in his essay. We need inequality and risk to drive development and stay ahead, which in turn allows us to secure and gain more resources.

I’m not saying Paul is wrong, and I don’t claim to have better ideas. I’m just pointing out these dynamics and wondering out loud if there’s a better way. Ultimately, it might be the only way—our technology, biology, and language may simply be inadequate for any other existence.

Assembly: An Outdated Course in CS

Recently, I had the chance to peek at a university computer science program (at my local university), and I was a bit surprised — not much has changed since my time, which made me feel a bit sad and wonder. You see, I work with young graduates, and essentially, they need to be taught everything. They don’t even know half of the stuff a developer needs to know in order to get or do the job. Mind you, I work for a company that is pretty far from the technological bleeding edge. And even then, most students entering the workforce don’t have enough skills and knowledge for the job, so they have to learn on the job.

There is nothing wrong with learning on the job, however, I do wonder: why do young people pay tens of thousands of dollars only to be taught outdated subjects, skills, and practices? The traditional answer from any CS university department would be, “We are teaching science here…,” but that’s not entirely true. Many of the courses are not focused on science; they are focused on software development. Those courses will teach you how to sort an array in five different languages — that doesn’t seem very scientific to me. Ironically, these are the courses that will get you a job or at least give you the chance to learn on the job, because without that knowledge, no one would even take a chance on you.

Let me pick one course that really grinds my gears: assembly. This particular course is horrifically outdated. Twenty years ago, when I was studying at university, the assembly course was already old and riddled with generations of mistakes that the professor refused to correct. Now, 20 years later, the same nonsense has only gotten worse.

First, the course is taught only in Microsoft Macro Assembly (MASM). So you must get Windows and install gigabytes of software, libraries, and other stuff just to run a simple, one-page assembly code that wouldn’t even add up to a kilobyte once compiled. If you are running Mac or Linux, well, you’re out of luck. The course guide recommends you use virtualization to run Windows and install all the necessary software. The course suggests a couple of alternatives, such as using NASM, which will not be supported or explained by the teacher, or using a Docker container, which is created by students, untested, and once again not supported by the teacher. Remember, you’re paying for this! Isn’t it marvelous?

Why can’t the software be organized in a simple VirtualBox image or, better yet, a Docker container that contains all the instructions, examples, and runs on any OS? Is a student taking this course supposed to learn how to install Windows and set up Visual Studio with all the dependencies? It took me nearly five hours to get everything installed and configured, and I’m no stranger to this. Let me say, teaching students how to install and use virtualization is far more useful and important than teaching them how to install Windows and Visual Studio.

Second, why do computer science students need assembly? Let me be blunt: I learned it, passed the course, and forgot it, never to remember it again. I don’t think an assembly course is needed for a general-purpose computer science degree. There’s no use case. The industry is working towards replacing the C language, and no one even considers assembly for any meaningful work. Yes, there are cases where people are still using assembly, such as Steve Gibson. Perhaps CS students with a cybersecurity focus must know/understand assembly, or perhaps video game developers might find assembly knowledge useful, but for most, learning assembly is a waste of time.

Instead of an assembly course, perhaps students should be taught to use VCS like Git. Git is useful, and its design is fascinating from a CS point of view (graph theory and such). Another useful topic would be build systems, such as Maven. It’s hard to imagine a company that doesn’t use a build system for continuous integration and delivery. Unit testing is another good subject that is both useful and applicable to any language. Process automation is yet another important subject. From a programming perspective, software design, functional programming, and refactoring are much more valuable knowledge than assembly language. In fact, all of these topics could be combined into a highly useful course instead of learning a useless assembly language.

Ironically, computer science programs keep teaching the same old and sometimes flawed material without any regard for the current state of the computer industry. It’s quite interesting to observe that only the professors who have worked in the industry understand this and organize their courses differently — I’ve seen it! But they’re 1 in 10. The rest teach outdated material from papers written 30+ years ago…

The Last Journey

Immortality is not an option, so we must face the music sooner or later. On a grand scale, the life of a person is not very noticeable; thousands of people embark on their last journey every day. Yet, those closest to us feel particularly special. I’ve been told that everyone processes such an event in their own way, and I’m no different.

For some, the journey starts abruptly, while for others, the beginning stretches out, like trailers in a movie theater before the main show. The prolonged ones seem to be the most difficult. Horrible pain and suffering, without even a glimpse of hope. Can you imagine being sick—having an endless flu, a fever that never breaks, constant headaches, muscle pain, coughing, and a runny nose? And along with all of this, you know, you understand, there is no getting better. There is no recovery. This will end in only one way. Now, multiply that pain several times over.

Departures are always sad. We miss loved ones, even when they embark on a great journey, yet these departures aren’t typically accompanied by excruciating pain that lasts for months on end. After all the pain, suffering, and goodbyes, the journey begins. So shouldn’t we rejoice that our loved one has finally embarked? Shouldn’t we feel some happiness, at least for their sake? Not for our own selfish feeling of being left behind, but joy for their journey—for their release, for the end of their suffering, when nothing more could be done. I don’t know the right answer. I just feel serene, with a trickle of sadness and joy. In my mind, it is not about me; it is about them, wherever they are now.

Rest now, Aunt Zoya.

Cycles, Life & Death

Everyone is different; all of us mutate slightly in different ways, and we don’t all come out identical—well, at least most humans don’t. This bundle of differences is called humanity. I guess that’s what makes it fun—a randomness factor. For some reason, I’ve never liked cycles. In a way, cycles annoy me. The irony is that over time I started to embrace routine, but not for the sake of it, but rather due to an aging body.

20 years ago, I got a gig at a car parts factory, working the night shift, packing plastic parts and cleaning floors when it was slow. The job sucked; I didn’t like working nights and going to sleep when everyone was out and about. But what bothered me the most was the job itself—the endless repetition of the same steps, over and over again, all night long and the next night and the next. It seemed like an endless cycle of doing exactly the same things over and over again.

Although I enjoy video games, the reason I don’t tend to play a lot (besides not having enough free time) is the repetitive cycle. Yes, different cycles and repetitions with a different combination of red, green, and blue on the screen, yet with sufficiently different cycles to get me bored or annoyed. There are only so many times I can go on a quest to kill 10 boars or whichever virtual animal is demanded by a virtual quest giver. Now I’m not complaining about games; I do enjoy them—I played Diablo repeatedly—I just want to point out my own personal mutation for lack of a better word.

Life itself seems annoying; it is repetitive cycles with a different given at each new start. You are 10, so you need to do this and that. You made it to 20 – education time, 30 – family time, 40 – wealth gathering time, 50 – health…, 60 – retirement… and so on. The illustration is crude but has some merit to it. Does it have to go that way? Well… no. There are different ways life can be played or be played out. Hey, remember: “live fast, die young”? – it is a viable option too. If I had a choice, I would probably go to the other extreme; let’s do the whole life thing for a few hundred years and then decide.

Human time constraints seem to put us into well-defined, optimized, and seemingly inescapable cycles. Each cycle presents its challenges, and there’s never enough time. Ricardo Semler had an interesting idea about working less and spending more time on ourselves early on and not waiting for retirement when the body is broken and tired. His arguments and ideas were very convincing! As much as I would love to implement that, I do not live in theory; bills are due, time is running, and food should be on the table. So cycles continue… meanwhile, we miss moments, and before you know it, people near and dear start to die off.

Those endless cycles of being busy, accomplishing things that seem meaningless now. If only we had more time, more time to make educated choices, more time to figure out priorities, more experience to understand what’s important to ourselves. Perhaps one day we may get more time, but for now, the only thing is to dispense it conservatively.

2 Years Since the Full-Scale Invasion of Ukraine

It’s hard to believe it’s been 2 years since the full-scale invasion of Ukraine. I figured that after the initial shock, the West would ramp up military support and quickly deal with the occupiers. However, that didn’t happen. Moreover, Ukraine is once again at a crossroads, with Iran, North Korea, and China providing support/weapons to the occupiers, while Europe continues to drag its feet, and the USA has fallen into inaction. I think the world is learning from this, and the unfortunate lesson is: the West is perceived as weak and easily disrupted. As long as a dictator can hold out, lobby, and flood the media with disinformation at comparatively low costs, any kind of crime will go unpunished.

Last year, Ukraine performed a counter-offensive. While expectations were sky-high, the results were underwhelming. I can’t help but wonder: how exactly was Ukraine supposed to perform an overwhelming counter-offensive in the first place? Let me break down my confusion: first, the counter-offensive was heavily advertised as if it were some kind of Super Bowl commercial at the end of times. I really didn’t understand the purpose of that. Then, Western weapons were delayed but finally arrived:

  • About 14 British Challenger 2 tanks
  • About 31 American Abrams tanks (but downgraded in capability)
  • About 80 tanks provided by various countries were Leopard 2s
  • About 88 tanks provided by various countries were Leopard 1s

In total, slightly over 200 tanks, considering I didn’t mention other variations of the Leopard 2, and I don’t consider the French AMX-10 RC as a battle tank. There was no aviation, no ATACMS, and a limited supply of long-range missiles such as Storm Shadow (Germany is still withholding Taurus missiles). Now, the list of shortcomings can be continued, but the picture is quite clear: 200 tanks versus fortified defenses and a few thousand Soviet tanks. Does that make any sense? But what makes me laugh (sadly) is the fact that Ukraine seems to receive, in bulk, only old tanks — for example, the Leopard 1. Really? Yes, it was modified in the ’80s, but… 88 tanks that were designed in the late ’50s.

So, to sum up my confusion: we give Ukraine old equipment and/or modern equipment in limited quantities and expect overwhelming results? I don’t know how this computes in anyone’s head. I really hope there is a winning strategy and that the West will eventually start acting as if it means it.

What gives me hope is the Ukrainian people who continue fighting despite the overwhelming odds. While some are at the front, others bring supplies, build drones, design new equipment, and more. This makes me believe that, at the end of the day, the forces of light will prevail. Ukraine will defeat this horrible evil.

Israel

I’ve been to Israel a couple of times, each time enjoying the country in different ways. In the last 75 years of Israel’s history, it has managed to build itself literally from the ground up – from a desert into a modern country. This achievement is quite commendable and hard to imagine, especially when some countries with much longer histories and larger resources haven’t managed as well.

On the other hand, over the last 75 years, its neighbors have prioritized violence, murder, and terror. Can you imagine living your entire life thinking only of killing your neighbor? They say “freedom fighters,” but the last election in Gaza was 18 years ago – is that freedom? 75 years of the same – hatred, violence, terror. Kids are taught to hate, teens to kill, and adults to support a system that leads nowhere. Yet, judging by the news, some people around the world think it’s a good idea.

I guess people on the streets want to see what they want to see, so let me tell you what I saw. The last time in Jerusalem, I was carelessly walking through the old market. There were a bunch of shops where Arabs were hustling. I was standing outside one shop, looking down the street. My eyes met the eyes of a kid who was standing outside yet another shop. He looked at me directly and made a throat-cutting gesture with his finger.

Ukraine is fighting for 7 months now

Couple of days ago, putler announced “partial mobilization” of 300 thousand men. In reality it is a full mobilization and numbers looking towards a million. It is not a good news for Ukraine, but let’s not forget, at the beginning of the war, situation was much worse.

As I was thinking about the mobilization, I decided to find a trailer for a documentary and it brought back memories of how fearlessly and courageously Ukrainians fought and continuing to fight. Mobilization will not help putler, it will not save anyone or anything, just one more stop on the way to hell.