Ръкописите не горят. – Воланд
Преди две седмици разказвах за адския ми проект. Забеляза се следния феномен – за два месеца мога да възпроизведа кода, който екипа ми написа в продължение на две години. Както и да го погледнеш, не изглежда много рентабилно – хем повече ресурси, хем много повече време. И това не е единственият ми такъв случай. Но как си го обясня? Ако на края на всеки проект откривам, че мога да го напиша драматично по-бързо сам, защо не науча как да правя това от самото начало и скоро да се пенсионирам?
В една от творбите на Михаил Булгаков героят създава ръкопис, който в последствие захвърля в камината. Когато научава това, Воланд му отговаря с горния цитат. Много дълбока мисъл и има прекрасен паралел с програмирането.
Сериозна част от процеса на създаване на софтуерна система е учене. Да научите спецификата на проблема, да научите как да го решите с наличните инструменти, да научите какви капани могат да се появят и как да ги заобиколите. Това е пробабилистичен процес, който е познат до болка на всеки опитен програмист. Повечето хора биха казали, че продукта на този процес е изходния код. Не съм съвсем съгласен. Според мен продукта е познанието за проблема и решението, което придобивате.
Казват, че не трябва да давате риба на гладните, а да ги учите да я ловят сами. Пишейки софтуер правите нещо подобно – ловите риба, но в някакви много специфични условия. Например на северния полюс – добре знаете как да боравите с въдица, но се налага да решите съвсем различни проблеми. Трябва да намерите откъде да се сдобивате със стръв. Трябва да проучите внимателно в коя част на леда да пробивате дупка. Трябва да намерите оптималния маршрут между водата и дома ви. Трябва постоянно да следите времето, за да не ви отцепи някоя буря. След като проучите и отработите всичко това, може да се заловите за работа – за няколко дни ще сте събрали достатъчно за идните седмици и може да си отдъхнете. Когато след месец запасите ви изтънеят, ще сте доста по-ефективни.
Малко разтегната метафора, но върши работа. При софтуера е много по-изявено. Писането на кода (ловенето на риба) е много по-малка част от добиването на нужните познания. През по-голяма част от времето размишлявате как да организирате приложението. Какви модули да идентифицирате. Какви процеси ще се случват. Какви класове и обекти ще има и как ще общуват помежду си. Трябва да научите всички тези неща за да създадете продукта си успешно. А веднъж като ги знаете, имплементацията е тривиална. И ако ви се наложи да започнете начисто, много по-бързо ще напишете кода.
Планирайте за изхвърлите първата версия на кода – така или иначе ще го направите. – Фред Брукс
Изглежда всички защитници на гъвкавите методологии проповядват горното нещо. И наистина, има логика. Опасно е да третирате кода, който сте написали последните няколко дни като свещен и да го защитава с религиозен фанатизъм. Той представлява единствено приложение на познанието, което сте натрупали. А най-вероятно – грешно и грубовато приложение, както намеква горният цитат. Поне при мен това се оказва вярно – ако изхвърля кода, който съм писал цялата седмица, успявам да достигна до много по-чиста и елегантна версия за по-малко от ден.
В резюме, продукта на труда ви като програмирате не са данните във version control-а, а познанието за проблема и решението, което натрупвате. Макар да не е много дългосрочно, ще е изненадващо колко дълго време стои в главата ви. И не се страхувайте да го изхвърлите. Ръкописите не горят. Не само ще успеете да го възстановите за минимално време – евентуално ще стане много по-добре.
Съвсем добре казано.
Пич, сега се сещам колко много е изгубила гейм-журналистиката в твое лице:) В един твой пост беше говорил как като малък си правил snake и други подобни за да напреднеш с програмирането, я вземи ни сподели и уменията за писане как си си ги развил;)
Метафорите са като лекциите – рядко помагат другите да разберат по-добре нещо, но определено съчиняването им те кара ти да го разбереш материята по-добре.
Една моя бивша учителка по информатика: първото решение на една задача винаги е смотано. Затова – винаги започвайте направо от второто.
Забелязал съм, че повечето програмисти се отнасят доста екстремистки към кода си. Една част от тях не дават с пръст да се бутне: „Нали работи, бе бате, кво ще го бараш“. Другите пък все искат да го направят най-добрия, същия онзи най-добър, който е най-големия враг на по-добрия. По-често съм от втората категория, но с времето все повече и повече се усещам кога да спра.