### MikeMirzayanov's blog

By MikeMirzayanov, 8 months ago, ,

Hey.

Last week I started the experiment.

I believe in semi-automated learning of programming through problem solving. There are clear advantages of this approach: independence of practice from the teacher, good testing of solutions, clear milestones for students, ability of the approach to scale.

The fundamentals of programming in this sense are quite good: it is easy to prepare problems, there is a clear learning plan, and student progress is well understood.

Surely some structured courses for learning the language from scratch already exist. But why not do it exactly the way I like it? IMHO, a set of problems is crucial here. The devil in the details: increase in the level of problems complexity, diversity, lack of requirements in mathematical preparation, and so on. I have teaching experience (OMG, almost 20 years!), some teaching materials from my work with students of Saratov University and the desire to try!

So, experiment. Since February 20, a wonderful girl le.mur has been learning the basics of C ++ from scratch under my supervision and guidance. We agreed that she captures her impressions in a special Instagram account (subscribe, it motivates!) Lena did not study mathematics in any special way, no initial skills in programming and informatics. Every day she practices 2-4 hours. I expect, one homework should be done in 1-4 days. My plan is to minimize individual explanations, as long as it turns out.

I brazenly stole a photo from Instagram

A training plan for the near future (that is, the very beginning) looks like this:

• The concept of a variable, the simplest functions (min, max, abs), problems without conditional operators and loops.
• Conditional operator, both forms (if, if-else). Understanding of scopes of variables, nested if-s. Problems on conditional operators.
• Loop statements: while and for. Problems for the use of loops without additional constructions (that is, they are solved in one loop without nested conditionals/loops).
• Problems to use loops and conditional operators together.
• Problems to use nested loops.

Each item corresponds to one homework and it will contain 10-20 problems on this topic. Further according to the plan, arrays and strings are expected, but they have yet to be reached.

One of the first conclusions that I managed to do for myself: at the initial stage, you should not immerse yourself in unnecessary details, a simplified or incomplete understanding helps to understand the basics. For example, while Lena operates only with integer variables (type int), she always puts curly brackets after control operators, uses only logical && and ||, only approximately understands the meaning of the “using namespace std” magical spell. It seems to me that after obtaining the initial skills, it will be easier to expand understanding with types, additional operators and other details.

I hope that Lena will succeed and she will not lose her motivation to study.

And how did you learn the very basics of programming? What worked well for you?

• +266

 » 8 months ago, # |   +134 Thank you, I will definitely try to do well and learn a lot of new things!
•  » » 7 months ago, # ^ |   0 Good luck!
 » 8 months ago, # |   +24 Hello! I used a Brazilian site, called CodCad, (now its into another one, NepsAcademy). It teached me the very basics at CP and my first teacher was Rogério Júnior, a ex-competitor, silver at IOI 2016. He was the main reason, cause the way he used to teach programming was awesome and enjoing. Now he's at MIT, so im studying here, at codeforces!
•  » » 8 months ago, # ^ |   +4 Can you identify the main reasons and features that made Rogério's course so interesting and useful?
•  » » » 8 months ago, # ^ |   0 The simple way he approached to the questions, pacience to explain and, mainly, the love he showed while coding and teaching. He was so inspiring and he trusted at my potential and told me that I could have a chance to go to IOI. After that, Im studying a lot in order to improve always!
•  » » 8 months ago, # ^ |   0 I also can say that I learned most from CodCad. Really useful to grasp the concept
 » 8 months ago, # |   +7 I did a self-paced online programming course, Harvard's CS50x, on and off when I was in 9th grade. But I feel like I've learned more from competitive programming and doing my own projects rather than taking a structured course, so this idea seems like a good combination of the two.
•  » » 8 months ago, # ^ |   +3 We all know Arrayman was born geniosity don't try to hide it
 » 8 months ago, # |   -13 I think, I know who'll beat tourist one day :D
 » 8 months ago, # |   +8 Yeah, that's basically how I learned programming. I had algorithmic theory from our local correspondence seminar, but as far as actual coding, I was just trying to solve problems and looked up concepts I had the most difficulty with (such as what the hell is standard input/output and how do I use it).
•  » » 8 months ago, # ^ | ← Rev. 2 →   +8 such as what the hell is standard input/output Heck, I had trouble understanding loops and arrays for couple of month in high school
•  » » » 8 months ago, # ^ |   +1 Features of imperative programming languages: you write what computations you want it to do, it does that (or something else... or crashes...).Features of an environment/framework: you write a magic command and a complex process gets done. How does that even work?
 » 8 months ago, # |   0 That's actually the same as my experience for learning my first language, C++. The teacher told us to solve problems using C++, and along the way I started to learn the basics of the language as well as those more advanced techniques (like sort by comparators, etc). I would say that such way of learning is pretty effective since the feedback (which is essentially the most important thing in motivating learning) is given immediately when you solved the problem.
 » 8 months ago, # | ← Rev. 2 →   +14 Cool idea for a blog, but maybe more details would be helpful for other beginners. Are you choosing problems from online judges or preparing something new with small jumps of difficulty?I remember a course of Pascal (and later C++) with simple problems: read A and B, and print the area of a rectangle with dimensions A and B. Reverse the array. Print the christmas tree made of characters '*'. So yeah, I also learned by solving problems.It would be cool to eventually have a start-from-zero series of problems/lessons in Codeforces. On the other hand, such things exist already for sure (like a Polish platform from which I learnt).
•  » » 8 months ago, # ^ |   +11 I use educational problems (mostly just exercises) I used in Saratov State U with students/schoolchildren. Also I prepared some problems because in some topics I don't have much easy educational problems. If this experiment succeeds, I will consider the opportunity to publish the materials in the form of a course.
•  » » » 8 months ago, # ^ |   +18 If you don't mind me asking, how exactly will you define the success of the experiment? Her being able to solve a certain difficulty after a period of time or maybe you have something else in mind?
•  » » » » 8 months ago, # ^ |   0 Maybe rating around 1700?
 » 8 months ago, # | ← Rev. 2 →   0 Great idea! I look forward to hearing how far this goes (I bet very far). And how did you learn the very basics of programming? Solving lots of problems on Project Euler :) What worked well for you? Getting instant feedback, having clear goals (for me, "solve the next 5 problems" is much more motivating than "try to learn Python, I guess"), gradually increasing difficulty
 » 8 months ago, # | ← Rev. 2 →   +151 only approximately understands the meaning of the “using namespace std” magical spell [hashtag]metoo
•  » » 4 months ago, # ^ |   0 \#metoo
 » 8 months ago, # |   0 Good job!
 » 8 months ago, # |   +15 I started solving problems after I had nearly completed 3 years in computer science, and I already knew most of the basic algorithms. Only after I started solving problems and competing online did I realize that I actually had not fully understood a lot of them, or the importance of complexity. I even lacked basic debugging skills, plus a lot of other stuff that I know consider to be basic knowledge. Not only did I gain coding quality and speed, I also started learning and using more advanced algorithms, and even having a good time while doing so, something I would have never done by myself by reading a book or attending some random lecture. TL;DR: I learned the basics in university, but what worked well for me was sitting down and solving problems and competing.
 » 8 months ago, # |   -10 Whats her age. as its also a factor. MikeMirzayanovi learned algorithms from geeks for geeks and online videos of tushar roy. the momentum i get is on codeforces. i practice alone. so when i get bored i watch petr mitrichev stream or his stories. i gets motivated.finally solve problems and as Petr said in one of his early blog. Have a confidence that u will suceed.
 » 8 months ago, # |   0 Thank you, I will definitely try to do well and learn a lot of new things!
 » 8 months ago, # | ← Rev. 2 →   +22 Your idea reminded me of my experience in adaptive simulator (Python example). The essence of the practical approach: a person is looking for information when it is needed. If the problem is not solved, the authors give a simpler one. + The analysis paralysis is unlikely (I know that gkseni loves this concept). This problem occurs among theorists and is sometimes called "overthinking".+ The information that a person searches for himself and immediately applies is best remembered.- Knowledge will not be complete (online course can help).- You need to have the strength to decide to open complex tasks, when you can enjoy only simple ones.And thanks for this post. My not very long way in IT began with a thought: to solve problems on the first date is so romantic. :D
 » 7 months ago, # | ← Rev. 2 →   +17 Update on March, 17: In 3 weeks le.mur solved about 60 problems, studying each day for 2-5 hours except weekends and few day-offs. Now she is studying linear arrays (she uses std::vectors).
•  » » 7 months ago, # ^ |   -10 apart from givig her algorithms teachings . are u giving her maths training too which is required to solve tough problems.
 » 6 months ago, # |   +27 Update on April, 15: In ~7.5 weeks le.mur solved 105 problems. She continues to study each day for 2-5 hours (there was a rest week because of ICPC finals plus weekends). She is starting std::string`s. I think after strings and practice with multi-dimensional arrays, she will be ready to take part in Div3 rounds!
•  » » 4 months ago, # ^ |   0 Сколько задач она решила за 4 месяца ? Вы можете где-нибудь добавит список этих задач?
•  » » » 4 months ago, # ^ |   +31 Please, use English to reply comments in English. I think there were a confirmation windows like "Are you sure your comment in English?" and you ignored it :-(I wrote about here progress below. Most problems are absent on Codeforces, they are not from the contests but they are special educational problems to study basics of a language. Probably, some day I'll publish them as a course for those who are just starting to learn a programming language.
 » 4 months ago, # |   +27 Update on June, 25: In ~4 months le.mur solved 182 problems. Now she is focused on problems with nested vectors.
•  » » 4 months ago, # ^ |   +60 Can't wait to be lower rank than her in Div3.
 » 4 months ago, # | ← Rev. 2 →   +1 I have a friend who wants to get into programming as well, do you Mike, or anyone else have a set of easy problems (truly beginner problems) for my friend to train in.I can explain him some simple things, but I almost never encounter simple problems in Codeforces for him to train in.A's in CF are sometimes what I think would be too hard for him and sometimes too unchallenging (they require simple observation and not a teachable C++ experience).I can probably find some good easy problems on Google, and I will, but if you have any good list that he can follow, it would mean a great deal.
•  » » 4 months ago, # ^ |   0 If he is really learning from the very very beginning, then probably a traditional book is the better option. If it is competitive programming then probably USACO training pages is best.