a collection of lengthy notes on how I am usually coward to do what is wrong and how I am sometimes brave to do what is right. Bits of management and self management, .NET programming, Clojure parenthesis and lots of design mistakes are the things one will find here.
воскресенье, 12 июля 2009 г.
I am sixth year student at CAD/CAM/PLM department of Bauman Moscow State Technical University (in Moscow, Russia) and now I'm working on my diploma, which is devoted to data analysis. I used to work part time as a junior software engineer developing a reporting application for a large PLM system, although I left job in March due to the need to work on diploma. I am interested in Artificial Intelligence and Machine Learning subjects and spend some spare time studying different articles devoted to these fields and, sometimes, trying to implement the techniques described there. Most of my activities involve programming - I love it and do a lot of it. I write programs mainly in C# (diploma and some pet projects), C++ (some university-related stuff) and Python (other student stuff, AI/ML tools study, etc.) Besides, I developed a project in Java and several minor applications in C++ for my employer.
I feel quite comfortable calling myself a programmer. I had started writing programs during my first year in university (back in 2006), although the idea to become a programmer conquered me only 2-3 years later - mainly to give way to the idea to be a programmer. The first three languages which I studied were the C-ones going in quite a logical order - from C to C++ and then to C#. However it is safe to say that I got any reasonable understanding of C++ only while working on some tasks in C# - I feel that the way in which my experience with the latter differed from writing programs in C++ and C helped me to develop better understanding of the Bjarne Stroustroup's creation as well as of object-oriented programming in general. These three languages were my only company in 2010 and 2011 - that is during my fourth year of study - the only intruder was SQL which I faced in the way of Relational Databases course. Considering SQL, I had more experience with it while dealing with a study project, which involved using database (MS SQL Server was chosen as a DBMS), accessing web-services (mostly SOAP and some REST) and pushing data here and there. Not surprisingly, I did the project on the .NET platform in C#. Speaking of Microsoft, I should also mention that I've taken several courses devoted to building .NET applications offered by the company - I will return to this later.
As for other programming languages which I have tried, in August 2011 I made my first steps in Python and this amazing language gradually became my 'everyday language' - now I use it for most university assignments and for numerous other tasks. Moreover, I often use the language to make first steps in a task even if I know that it will eventually be done in another language - Python's simplicity and readability lets me quickly outline the main ideas behind the problem in question and it's future solution. I have never used Matlab, except for doing Andrew Ng's Machine Learning online class assignments in Octave which is quite similar, so I do the tasks that involve some simple math in Python as well.
There is one more language among those which I've tried - Clojure. Being a functional language it differs considerably from all the languages which I have mentioned above. One of the reasons behind exploring Clojure was the mere fact that the functional programming paradigm is very popular nowadays, which made me eager to try something functional. As for choosing this particular language from the multitude of functional ones, that was almost random choice - I just came across some article or an essay mentioning Clojure and downloaded it. Several short but painful detours into the immutability, recursion and parenthesis territory were enough for me to fall in love with the language, although I haven't accomplished any serious task in it yet. "I'm Winston Wolfe. I solve problems." One thing I have tried to use Clojure for was downloading multipaged html from the web and merging these pages into a single document after some simple preprocessing - being a childish task this still helped me to get accustomed with Clojure's syntax and some basic features.
Besides the languages, when speaking of being a programmer I should also mention that I have some experience with the ideas of TDD and testing frameworks, including NMock for .NET, JUnit and JMock for Java and gtest for C++. Sincerely speaking, I'm not a true follower of TDD, although I do try to stick to its principles and to support the pieces of software, which I create, with automated test suites. Another tool which I almost always use is Mercurial revision control system.
One more thing to mention is that I programmed a lot in Java - the main counterpart of .NET with C# and the basement of Clojure at the same time - this one I used in my job.
I worked part-time as a junior software engineer for almost a year. I cancelled job to devote my efforts to diploma this March. Before that my work involved mainly developing an application for pairing a PDM system with one of open source reporting engines - as you may have guessed the application was being written in Java. Another thing that I did for the same employer was creating a couple of simple applications in C++ for CAD/CAM system from the same vendor. The company I worked for is quite large, but hardly known anywhere except Russia. As for my department, it serves as a supplier and maintainer of different PLM systems (mainly CAD and PDM) for many Russian customers and develops some extensions to these systems as well. I can't say that the tasks, that I dealt with, involved any really hard problems, still these were complex enough to be interesting for me.
As for my educational background, now I'm experiencing the 6th (and last) year of study at CAD/CAM/PLM department (department's page - in Russian only) of Bauman Moscow State Technical University. The five preceding years of study allowed me to get some knowledge of basic engineering subjects as well as provided more or less deep insights into the matters of CAD systems. Besides that, my curriculum included multiple CS subjects.
My diploma project is devoted to data analysis - I am going to do my best at exploiting the study progress data accumulated in our university to make up a piece of software capable of producing some reasonable predictions. In fact, now it is quite difficult to say how far I will go this way and where I will end up, but my project will definitely involve using machine learning techniques as well as building an OLAP cube. Additionally, I will consider providing reporting facilities by means of some reporting engine - at least, it correlates with my recent job. One may be surprised by the fact that the subject of my diploma diverts significantly from my department's field and yes, it does, although I could argue that CAD and, broadly, PLM systems involve lots of data analysis.
On the other hand, I try to benefit from the availability of numerous vendor courses of which most suitable for me are those offered by Microsoft. I have attained M10262, M10263 and M10265 courses which are devoted to WPF, WCF and data access facilities included into .NET platform, respectively. As for corresponding exams, I have past one that deals with WPF and a general C# programming exam. I am also looking forward to take the WCF and data access solutions exams as soon as I will get more vivid experience with these tools.
Another subject to mention here are my interests. It is clearly seen from the paragraphs above that I am fond of programming and software development. I can't say that I perform amazingly in either of these fields, but I do enjoy both and try to do a lot of development and even more programming. At least, I feel that now I am much better developer than I used to be, say, a year ago - and this feeling of progress persists for some time already. In this context, a career of software engineer looks appealing to me, though the question of what to specialize on remains in place.
One more field, closely connected to software engineering, attracts me - that is Artificial Intelligence. Here I am much worse than in programming. My only detours to this territory were multiple attempts to code different artificial neural networks and some experience with Prolog during an Intro to AI course at the university. I have also received some more insights from Sebastian Thrun's 'Programming a Robotic Car' and Andrew Ng's 'Machine Learning' courses, which I have mentioned above. The key sources of motivation to explore AI for me were books, notably 'Godel, Escher, Bach' by Douglas Hofstadter and numerous works by Stanislaw Lem (Golem XIV and Summa Technologiae could be highlighted). Besides that, the Hyperion saga by Dan Simmons must have also played an important role here. Speaking of actual steps taken in this direction, I haven't invented anything reasonable yet and have only studied some articles devoted to the subject. Because I am fascinated by the notion of artificial neural networks, these were the subject of most of papers. I still plan to continue investigating the field and have some ideas to implement. However, I am not sure whether I will stick to the ANN field in case I do any serious research in AI - so, similarly to my developer-side, no choice has been made here yet.
Feel free to contact me - via comments, or twitter.