Как станах по-добър програмист?

Един коментар към тази статия ме накара да се замисля. Въпросът е доста специфичен – какво съм направил, за да стана по-добър програмист от колкото съм бил в началото?

Към днешна дата стават общо 8 години, в които активно програмирам и си изкарвам хляба с тази професия.

През тези 8 години съм имал най-различни представи за това що е то да си програмист и не малко пъти съм си мислил, че знам всичко и повече развитие няма.

Като погледна назад виждам няколко сравнително ясни неща, които са ми помогнали да стана по-добър. И то не само по-добър в това да мога да пиша на повече езици и технологии, а по-добър в това да разбирам в дълбочина нещата, с които се занимавам.

Да мисля, преди да пиша.

В тази статия няма да говоря за продуктивността на програмиста, тъй като това е важно, но и заслужаващо отделна статия нещо.

Disclaimers:

  1. Разбира се, цялата тази статия стъпва върху предпоставката, че съм добър програмист 😀 Та нека предположим, че ставам.
  2. Разбира се, това е моят опит и той не е задължително да работи за някой друг човек. Написаното е в иторически план и е self-reflection. Опитал съм се да бъде проследима мисълта, но на моменти това свойство се изгубва.

Началото – Flash, Flex

11ти клас беше моето “зарибяване”. Опитвах се да пиша малко на C++, но истинската ми страст беше Flash и Flex – да се разработвам игри и “Rich Internet Applications”. Тогавашния hype.

Тогава си нямах на представа какво се случва. Стилът беше copy-paste driven development и проба-грешка, докато не се получи каквото трябва. 50-редови if проверки бяха ежедневие.

Уроците на Lynda.com бяха моят източник на знания и можех да правя нещата, които се правеха там. И много малко отстрани.

Тогава не бях добър програмист, a бях просто ентусиаст.

PHP и WordPress

Естественото продължение на Flash и Flex света беше да имаш сървър, в който да пазиш резултатите на дадена игра.

Най-естествено и спрямо моето много ниско ниво, аз се спрях на PHP.

Беше славна година, в която пишех всичко – блогове, форуми, чатове, браузърни игри и всичко друго, сравнително безполезно.

Това беше моментът в който се чувствах много силен в своите програмистки умения. Можех да решавам произволни проблеми и това беше важно. Фактът, че пишех код, който не ставаше за нищо не беше от значение.

Като погледна назад се радвам, че започнах с PHP. Това ме научи на основните и важни неща в уеб програмирането, без да имам тежка абстракция отгоре. Но също така се радвам, че успях да прогледна и превъзмогнах този език.

Редом с PHP правех и много WordPress разработки. Схемата е ясна – купуваш тема, нацъкваш сайта с plugins и правиш сайт за 500 лв.

Тогава не бях добър програмист, a бях просто ентусиаст със самочувствие че знае много.

ФМИ и Компютърни науки – началото

Въпреки че учех, за да ставам лекар (inheritance, you know), някак си случайно се озовах във ФМИ (София), след като с Василен (тогавашен мой съученик в МГ Плевен) взехме някакво престижно място на НОИТ и изкарахме 5 и 50 за ФМИ. Проектът беше интересн – Flash, Flex, PHP и JavaScript за образователен портал с образователни игри.

Реших да запиша Компютърни науки, защото така. Там бяха умните, а и познавах голяма част от тях.

1ви курс беше доста тежък и искаше доста учене. Аз разбира се можех да програмирам и курсовете като Увод в Програмирането, Обектно Ориентирано и Структури от данни ми бяха лесни. Почнах да уча Java и се справях добре с нея.

Математиката беше друга бира. Там трябваше сериозна работа, пък и не разбирах точно какво се случва.

По това време Наков беше популярен.

Аз, като един наивен младеж, реших да вярвам на Наков, че математиката не е нужна. И без това беше трудна. Какво по-добро извинение за да не полагаш усилия?

По това време усилено учих Java и обръщах внимание на алгоритми и структури от данни. С изборната дисциплина “Съвременно Java програмиране” + редовните курсове събирах по 20 часа Java на седмица в университета. Имах добри преподаватели и бях изчел доста книги и правех много странични проекти. Всичкото това на Java.

В началото на втори курс започнах стаж с Flex и Java в компанията, която обича буквата v.

Тогава не бях добър програмист, a бях просто ентусиаст със самочувствие че знае много и вече добра доза арогантност що се отнася до ФМИ и математиката.

Начало на преподаването

Година по-късно бях започнал да трупам невзети изпити. Тогава излезе една много интересна възможност – да участвам в преподавателския колектив на изборната дисциплина “Съвременно Уеб Програмиране”, заедно с Иво Христов, Жоро Пенчев и други.

Ставаше на въпрос за преподаване на PHP и JavaScript, а аз все още пишех и на PHP и нямах нищо против.

Когато започнах да преподавам, нещо в мен се промени. Говорех за неща, които не ми бяха напълно ясни. Задаваха ми въпроси, на които не знаех отговора (а понякога не знаех какво ме питат).

Започнах да осъзнавам, че има още много хляб да ям. Освен това, не разбирам нещата в дълбочина.

Тогава започнах активно да гледам видео уроци и клипчета в YouTube. Основно от MIT и Harvard. Бях жаден за знания и дълбочина в полето на програмирането.

Благодарение на Жоро Пенчев, станах асистент и на 2 групи по Функционално Програмиране. Фактът, че преподавателския колектив беше много силен и факта, че не исках да се излагам пред студентите ме бутна много сериозно в писане на код и в подготовка.

Въпросът, който винаги си задавах, когато подготвях материал е “Това сега защо ни трябва и за какво е тук?”. Опитвах се да има последователност в занятията и да вървим по нишка, която ще ни доведе до по-голямо прозрение за програмирането.

Основният ми източник тук беше SICP. Силно препоръчвам преглеждането на тази книга.

Преподаването беше първият момент, в който си отворих очите и разбрах, че съм бил просто арогантен студент, който може да пише код, който решава проблем X. Нищо повече.

Втори епизод на преподаване

Тъй като все още се занимавах основно с PHP и WordPress за изкарване на хляб, а преподаването ми беше харесало и ме беше научило на страшно много неща, реших да водя курсове в някоя академия.

По стечение на обстоятелствата започнах да водя курсове в SoftAcad. За мен беше много полезно преживяване, защото работех с хора, които хал-хабер си нямаха от програмиране, а аз трябваше да ги уча на уеб.

Изкарах 2 курса – “Уеб Програмиране с PHP” и “Бази от Данни”.

И докато преподавах, нещо много сериозно ми беше направило впечатление – водех курсове на хора, които бяха излъгани, че ще станат програмисти след 4 месеца, когато те нямат и базовата основа. Предпоставката беше, че те ще се научат на всичко в курса, защото са платили. До ден днешен, подобен тип академии продължават да правят подобни неща.

Времето, което прекарах в SoftAcad беше достатъчно, да ме бутне в посока за това да си направя собствена академия.

Към този момент бях среден по възможности програмист. Можех да пиша уеб и се оправях с JavaScript. Имах сравнително добри знания по програмиране и бях прекарал известно време борейки се с курса по Алгоритми във ФМИ.

Ако исках, можеш да си намеря добра работа с добро заплащане като уеб програмист с PHP. И до момента щях да съм на същото ниво.

Математиката

Както споменах по-рано и аз имах “Наков период” в моето развитие. “Математиката не ти трябва” беше лайт мотив за мен и много мои колеги.

Също така имах и 13 невзети изпита (как съм записал 4ти курс е тема за друга статия :D), като голяма част от тях бяха математически.

Почнах да уча по принуда и да търся клипчета в YouTube / Coursera / Khan Academy, защото в уикидот повечето неща не са обяснение добре. И тогава започна да ми става интересно. Колкото повече разбирах дадената математика, толкова повече връзки правих с програмирането.

Сесията, в която изчистих 10 от 13 изпита беше голямо израстване за мен. Учех почти и само математика. Основно от Coursera и Khan Academy. Специално в Khan Academy бях изгледал всичкото видео, което беше свързано по някакъв начин с “висшата” математика.

И тъй като бях с ограничено време, не учих на изуст, а учих, за да разбера. За да мога да възпроизведа “защото” на материала. Беше ми интересно и успявах да предам този ентусиазъм и на част от изпитващите.

В този момент ми станаха интересни езиците за програмиране сами по себе си. В този момент започнах да виждам абстракцията на много повече нива.

Това беше момента, в който се освободих от Наковите лъжи и от сляпото преследване на диплома заради самата диплома. Започнах да търся знания. Мога смело да заява, че ученето на тази математика ме накара да израстна и да започна да гледам на програмирането по съвсем друг начин

Математиката ме направи по-добър програмист. Беще трудно и именно тази трудност помага за израстване.

Занаят и инструменти

Паралелно с това, благодарение на хора като Стефан Кънев, Божидар Бацов, Киро, Митьо и компания, започнах да се замислям за това как работя и за това как се разработва един софтуер.

До тогава използвах Windows за операционна система и някаква разновидност на Eclipse за среда за разработка, което беше последвано от Sublime.

Тъй като ученето на цялата тази математика ми даде много, реших да се пусне в посока Linux за домашна употреба, въпреки първоначалните трудности.

Това ме накара да използвам много повече терминал, което пък от своя страна доведе до момента, в който започнах да използвам vim като текстов редактор. За щастие, това беше моментът в който пишех главно на Python / Ruby / JavaScript и нещата си пасваха идеално.

Бях изключително непродуктивен, но с времето, терминала и vim ме направиха много по-добър програмист. Бих ви препоръчал да излушате и някоя друга лекция по въпроса.

В момента, времето, което прекарван пишейки код е главно в терминал и vim. Въпреки, че имам доста слаби dotfiles, продуктивността ми отодвана мина тази, когато работех със Sublime.

A Windows се ползва в случаите, в които трябва да излезеш от gold-а на StarCraft 2.

Преподаване, споделяне и говорене

Със старта на HackBulgaria, преподаването се превърна и в професия. Когато водиш курсове в твоята собствена школа, не можеш да си позволиш да си слаб. Това означава, че за да преподадеш нещо, ти трябва да:

  1. Да разбереш за какво става на въпрос.
  2. Да можеш да го обясниш
  3. Да можеш да го имплементираш, особено ако е фундаментална концепция
  4. Да изрешиш задачи, които после ще даваш на курсистите

Правенето на това нещо в рамките на вече 2 години дава страшно много.

Започнах и да говоря по разни събития, като част от видеата може да видите тук. Говоренето пред публика на технически теми е същото като преподаването. Изисква подготовка и добър начин на представяне на информацията.

Това беше моментът, в който осъзнах че най-добре учиш нещо, което трябва да преподадеш.

Писане на софтуер, който се използва от хора

И като за край остана нещо много важно. През цялото това време винаги съм се опитвал да пиша софтуер, който да се използва директно от хора.

Тъй като бях видял колко безполезни неща мога да пиша за университетски проекти реших, че ако ще се пише нещо, то трябва да бъде поне донякъде полезно на някой за нещо.

Писането на такъв вид софтуер те учи на умения, които няма как да се преподадат в който и да е курс.

За мен финалният изпит за всеки един програмист е дали може да напише нещо, което да не е готово за изхвърляне от първия ден, и което ще бъде качено на production, за да се използва от други хора (или пък от него самия/самата)

TL;DR

Тъй като статията излезе по-дълга от колкото я исках, ето едно кратко обобщение на нещата:

  • Преподавайте. Няма по-добър начин да се научи нещо, което трябва да бъде обяснено от вас на други хора.
  • Учете математика и теория. Задълбавайте там. Няма да получите директната полза, която да може да я приложите в работа, но ще получите начин на мислене и начин на виждане, които нямат замяна.
  • Избирайте си и си развивайте инструментите, с които работите. default настройката е добра за старт, но не и завинаги.
  • Пишете код, който се ползва от хора. Така ще имате стимул да пишете хубави неща, да пишете тестове, и т.н.
  • Учете различни езици и технологии. Пробвайте нещо функционално, нещо статично типизирано, нещо динамично. Пробвайте нещо от по-ниско ниво. Пробвайте хибриди (да не се тълкува като хибридни мобилни приложения. Това може и да не го пробвате :D)
  • Търсете модели и шаблони в нещата, които учите. Изнесете знанието извън конкретната технология и език, за да може да го прилагате винаги.

Към момента стига толкова. Аз имам още много да уча и ще продължавам да го правя. Правете го и вие.

Write us your thoughts about this post. Be kind & Play nice.
  1. Поздравления,

    Статията е много на място. Продалжабай нататyк 8 години е малко за опит ( аз вече имам 32 гoдини първата си програма написах на 14 на 6502 )

    Опитай се да пишеш малко на ассемблер / c/c++ – ардуино е добра платформа за старт – важно е да разбираш как точно работи процесора за да може да филтрираш глупостите които постоянно се говорят.

    Поздрави

    Reply
    • RadoRado says:

      Нещо, което определено ще пробвам 🙂

      Със C++ сблъсъка ми е чисто алгоритмичен, за курсовете във ФМИ.

      Reply
      • На мен личния ми избор е Java поради незаменимите библиотеки за мулти-тредови приложения. Но C++ е много ценен защото при него има най-голямото мнойество от възможности и реално всички други езици са като под-множества – но самото C също е интересно тай- като е реално по близко до това което наистина става – а и е добра практика да се научи как може да се довнградне една библиотека например написана на C++ да се използва от C

        Reply
  2. бтв: Свтлъо не е лош програмист и математиката му е добре, но се е комерсиализирал напално и повечето хора вместо да слушат и да четат между линиите чуват каквото им се иска да чуят – т.е. като реклама хем казваш истини хем хората чуват огромни опашати лажи които им се искат да чуят… гледай повече да се учиш не от Светлин а от Преслав – Преслав не сам го чул никога да казва глупости – аи СофтУни ще стане истински само когато видя Преслав да преподава там…

    Reply
  3. Stilgar says:

    Изглежда аз съм единственият почнал да програмира след 2000 година, който никога не се е съмнявал в ползата от математиката. Всъщност дори леко презирах програмирането като математика за некадърници

    Reply
  4. Добре казано.

    За мен откровенията бяха когато с изгорял диск не можех да събера паскала на една дискета и научих асемблер за x86, а в последствие от любопитство решавах задачи от сорта как да намерим свободната памет и да изчетем системния код от дискетата в нея, с код който се събира в 512 байта – успявах даже да вметна включването на процесора в защитен режим …

    Друго силно нещо беше как да ренднем страничка с камара видеа и реклами на нея, като говорим с базата данни не повече от 50 милисекунди средно, 200 милисекунди максимум веднъж на 10000, защото иначе сайтът се насмита от заявки и загива – това беше на PHP за сайт с над 1200 заявки в секунда средно, който прави загуба от хиляди долари за всяка минута в която не работи …

    Трето много отварящо очите е било навлизането в код, писан от други програмисти, разбирането на архитектурата и продължаването и усъвършенстването й без да извърлиш всичко в кофата и да го започнеш от начало …

    Reply
  5. Един познат го нарича неща от “Александрийската библиотека” и реално е прав те са много стари неща – обаче без тях ниама как да се разбере принципа на нещата – защо и как работят.

    Reply
  6. Тука малко е станало hateroom for Nakov. 😀

    Reply
    • Много странна е цялата ситуация, защото първо в статията авторът пише, че за няколко месеца не можеш да станеш програмист, а сега в неговия сайт гледам, че за 4 месеца даже може и да почнеш работа, че и на JAVA. То така се ставало програмист на JAVA. В SAP само такива “търсят”. Ето линк: https://hackbulgaria.com/courses/programming-101-java/
      Не знам дали РадоРадо познава Наков или, ако го познава, не знае за него доста неща. Това го казвам, защото Светлин винаги е казвал, че за 4 – 6 месеца не може да се стане програмист, а между година и две. Дали го казва, защото да има постоянно курсисти, които да си плащат курсовете, с което той пък печели от цялата история, но и дава качествено преподаване, не знам. Всеки е свободен да си прецени дали е прав или не. Едно от нещата, които ми харесват при него е, че постоянно сменя обучителната програма спрямо пазара, за да е адекватно обучението. А и има и друго, че конкуренцията (в случая СофтУни) те прави човек, който да отхвърляш, по един или друг начин, качественото.
      Лично аз съм студент в СофтУни и смело мога да заявя, че университета доста напредва и наистина дава качествено образование. Не съм защитник или противник на Наков.

      Reply
      • RadoRado says:

        Нашите курсове са подготовка за първа работа. За да влезеш в тях не става ако не си програмирал поне 1 година преди това.

        А иначе Наков го познавам от доста време. Той говори това, което е маркетинг изгодно.

        Reply
    • RadoRado says:

      Ами не, няма hate. Просто мнение.

      Reply
  7. Alex says:

    То, хубаво, съгласен съм като цяло, ама от статията излиза, че PHP и Javascript-а са за аматьори?!?!? И че едва ли не, за да си про трябва да програмираш на Vim и терминал??? Аз винаги съм смятал, че един добър програмист 1. Трябва да може работи в екип, да приема критика и съвети и да не се притеснява да поиска помощ и 2. Е тесен специалист в даден език и най-вече в съответните фреймуъркс и технологии (то това важи за всички професии май), а не да знае 15 езика, астрофизика и електроника и да летят алгоритми и функции дет само той си ги разбира и в крайна сметка приложението бъгаво и не бачка на половината устройства :))) , нещата не опират само да алгоритми и програмистки пируети. Та, човек трябва да се пази от “майсторската” болест…

    Reply
  8. Craddle says:

    Всъщност попаднах на блога ти, заради бъдещата презентация как да оцелеем като стажанти… Наистина, на теб добре ти се е получило, дано да успееш да го предадеш и на останалите.
    Разгледах ти linkedin, ако е верен и видях, че си работил като програмист – само докато си стажувал…

    Reply
    • RadoRado says:

      LinkedIn ми е супер много out of date. Работил съм като програмист винаги през последните 7 години, независимо с какво друго съм се занимавал. С това си изкарвам хляба 🙂

      Reply

Leave a reply.