September 10, 2009

Who am I?

I am the original author of DataObjects.Net – one of the oldest ORM frameworks for .NET. Currently I’m the architect of its 4th version, which is a completely new product.

Besides that, I’m CEO at X-tensive.com – the company that stands behind DataObjects.Net, and that initially appeared because of this product.

I maintain a set of blogs related to my professional interests:
Finally, I'm one of leaders of Urals .NET User Group (UNetUG). Almost all group meetings and talks there are organized with my involvement.

That was a part related to my current professional interests. To make this post more complete, I'll mention few more facts about my personal life:
  • I'm 29. 22nd of December, 1979 is my birthday.
  • I'm married for 8 years, now we have two sons (Roman and Eugene).
  • Periodically I become a movie fan ;) I'm tracking all the new ones trying to watch the best. If the time permits, I write short reviews.
  • I like sport, but I was ignoring it at all during last 6 months (thank you, DO4 :) ). Really pity. It is boxing (obviously, not professional), snowboard, swimming (again, non professional, but 5km distance is ok for me) and regular fitness.
  • I do not smoke, although I was smoking for about 5 years starting from late school. I almost don't drink as well (~ few times per year).
Hmm... I noticed that above 5 lines looks more like offtopic here ;) Likely, it will be more interesting if I'll tell you about this:

How I started to write programs

I wrote my first program nearly at 10. My first programming device was Elektronika MK-61 – a Soviet programming calculator, LOL ;) The first program I wrote was a simple calendar (DD.MM.YYYY -> day of the week). The author of this task was my father (Eugene Yakunin) – he was vice-CEO at Elecond that time (this big plant is still slowly dying, although almost 20 years has passed from Soviet Union times), and an engineer by education. He never tried to program himself, but did a lot to help me with choosing the direction to go.

My very first PC was ZX Spectrum - I was 12 when I got it. It was really a progressive one in Soviet Union that time. My first programs there were written on BASIC; I remember I wrote a simple star ship shooting game, where the star ship was actually a triangle. At 13 I was programming pretty well on Z80 assembler - of course, for my age ;). I still have some copies of these programs. One of the most practically interesting ones was vector font editor written mainly in assembler.

At 15 I switched to PC/DOS. It was a PC with i486 processor and 4 MB RAM. I started from Turbo Pascal there, but almost immediately switched to Zortech C++, and later - Watcom C++. I knew about it because of Doom game, that was one of the first games working in i386 protected mode, and its i386 protected mode stub was printing the name of its compiler. Btw, the compiler was really good. I remember I dreamed about it on programming contests - RAM limit of Borland C++ compilers was driving me crazy even although I knew it's enough to solve the problem ;)

I should add C++ was the first language I found really beautiful. Not C, but C++ - its object-oriented nature was looking quite close to the way I wanted to think about programs.

While studying at school, I was programming for fun. It was mainly a stuff related to 3D rendering - I dreamed to develop a 3D game that time ;) And it was really fun. Here are some screenshots of this "software":

Miscellaneous (see alt. text):
Realtime Julia set computation. Assembler, ~ 500 bytes. Raytracing. Almost realtime now ;)
Realtime electromagnetic field computation

Simple 3D modeler:
Simple 3D modeler Simple 3D modeler
Simple 3D modeler

Game prototype. Realtime Gouraud shading :) Never finished.
Game prototype. Realtime Gouraud shading :) Never finished. Game prototype. Realtime Gouraud shading :) Never finished.

Realtime voxel landscape rendering, v1.0:
Realtime voxel landscape rendering, v1.0 Realtime voxel landscape rendering, v1.0 Realtime voxel landscape rendering, v1.0

Realtime voxel landscape rendering, v2.0. This was the last work I started in school; it was finished on the first course of university:
Realtime voxel landscape rendering, v2.0
Realtime voxel landscape rendering, v2.0

You may find (by studying the labels on above pictures) I thought about my own company starting from early teen ages. I tried to choose the pictures without labels, but it was completely impossible to get rid of them from few ones ;)

The same time I was participating in programming contests - pretty successfully. 2nd place on regional contest (Sverdlovskaya oblast, or "Yekaterinburg region") was my best result in school.

So programming is what I really enjoyed that time. I mostly tried to develop a real time solutions and considered everything else as boring. Studying the last year in school, I knew linear algebra well enough to understand many computational algorithms related to 3D rendering - e.g. depth sorting, binary space partitioning and radiosity (I didn't implement it, but always wanted to find some time for this). Remember that until 3Dfx came to a scene, 3D rendering was solely your own problem, moreover, there were no Z-buffers and only 256 colors. So it was definitely not a peace of cake ;)

After school I started to study theoretical physics in Urals State University. "Why theoretical physics?" - you could ask. That's because I was good in physics as well, and my father finally said me: "You must try yourselve here as well - its clear that programming will anyway be in the list of your competences, so you will be able to further study it in your free time".

And I was really interested in studying physics during first 3 years. As well as programming - during this period I mainly played Delphi and C++ Builder. That's why I liked .NET/C# later - both Delphi and C# are architected by the same person (Anders Hejlsberg). During the same period I started to use databases. BDE and MySQL were the first ones I tried, although further I was focused mainly on Microsoft SQL Server.

I used C++ Builder to solve even computational problems (I used Mathematica as well, but not always). Here are screenshots from a program I wrote for one of my course works:
C++ Builder is used in my course work C++ Builder is used in my course work
C++ Builder is used in my course work C++ Builder is used in my course work

The graphics you see was rendered by my own charting control. You could move & zoom the chart there with the mouse. Labels on axes were carefully placed to avoid any overlapping. But its most attractive feature was real-time rendering with smooth chart edges. Note that smooth rendering was not supported by GDI that time. I achieved this because I actually used OpenGL to render the chart ;)

Starting from the 4th year of my study in USU physics became a hell for me. I was coming to a conclusion my brain simply isn't tuned up for true theoretical physics at all. Probably, that's because I was pretty rare guest at lectures, so it was harder and harder for me to prepare myself to each subsequent examination. But I think there was much more important reason: I clearly seen I will never be among the best students in physics. And on contrary, I can be the best in programming.

So that was a year when my real-life programming career has started. You can get some imagination of what I was doing later by visiting my LinkedIn page, so I won't tell much about this now. Or that's the story for another time ;)

The list of languages and compilers I had practical experience with during my school and early student years includes:
  • Assembler: - I suspect, at least 5-7 implementations for Z80 and Intel CPUs, including the one built-in into Watcom C++ compiler and Microsoft MASM
  • Basic: that was my first real programming language on ZX Spectrum. Later I tried a set of its compilers there, including Tobos FP. When I switched to IBM PCs, I also studied several ones, including QuickBASIC and VBA.
  • Pascal: Turbo Pascal, and later - Delphi. As far as I remember, the last version I used was Delphi 6.
  • C++: I used many of its compilers - at least, Borland C++, Zortech C++, Watcom C/C++, GNU C++, C++ Builder, and Visual C++.
  • Java: I just started to play with it that time. As you might remember, it was initially designed for browser-based applets. That's why initially I didn't like it much - it seems I looked it up too early. Later Sun realized its true potential and brought it to enterprise software developers. But when I got a chance to look it up again, .NET was upcoming.
  • Scripting languages: .bat files, JavaScript, VBScript and PHP were my favorite ones that time.
Ok, my first true post here is coming to an end. If you read this sentence, I hope you aren't disappointed. It uncovers some aspects of my nature: I suspect only few of our employees know I was 3D programming fan in the past, or that my first programming device was Soviet programmable calculator ;)

Partially this explains why I pay a lot of attention both to an architecture and a performance of solutions we develop. I fully aware that the optimization must never follow before the implementation, and follow this rule very strictly. On the other hand, I never allow to implement a solution utilizing a completely wrong algorithm in case when the performance is potentially important. So you can be 99.9% sure you won't discover we use an algorithm with O(N) complexity instead of O(log(N)) in any code that have even a tiny chance to be a bottleneck in some real-life conditions. So we're choosing the solution for each particular case very carefully.

P.S. In future I'll try my best to ensure this blog worth reading. I'll be glad to see you next time here.