Dnes jsem se hrabal v materiálech ze střední školy (2. ročník, rok 2008), jestli je tam něco užitečného nebo to můžu smazat. Narazil jsem tam na pár zdrojáků z předmětu programování a dobře jsem si připomněl, jak krušné pro mě začátky programování byly.
Jestli si dobře vzpomínám, v prváku jsme měli půl roku C, pak půl roku C++ a od druháku až do konce C#, tehdy verze 2.0, i když 3.0 už byla venku. Programování mi vůbec nešlo, myslím, že jsem dostal na konci prváku za 4 a na jedničku jsem si musel počkat až do maturity. Upřímně, ani mě tou dobou nebavilo, nevím čí vinnou, jestli děsivého vyučujícího nebo počítačových her. Zdroják, který jsem našel a je funkční (to pro mě nebyla zrovna běžná věc), hledá počet různých znaků v zadaném řetězci. Tady je kód v podobě, v jaké jsem jej našel.
static int PocetRuznychZnaku( string retez )
{
List<Znak> znaky = new List<Znak>();
for ( int i = 0; i < retez.Length; i++ )
if ( ContainsZnak( znaky, retez[i] ) )
{
Znak z = znaky[GetIndex( znaky, retez[i] )];
z.count++;
}
else
znaky.Add( new Znak( retez[i], 0 ) );
return znaky.Count;
}
struct Znak
{
public char znak;
public int count;
public Znak( char z, int p )
{
znak = z;
count = p;
}
}
static bool ContainsZnak( List<Znak> z, char znak )
{
foreach ( Znak zn in z )
if ( zn.znak == znak )
return true;
return false;
}
static int GetIndex( List<Znak> z, char znak )
{
for ( int i = 0; i < z.Count; i++ )
if ( z[i].znak == znak )
return i;
return -1;
}
Hrůza, že? Snažím se zpětně přijít na to, co bylo příčinou.
První, čeho jsem si všimnul, že kód má rysy Céčka. Není divu po roce programování v C/C++. Na uložení informace o znaku je použitý struct, což by ani nevadilo, kdyby byl implementovaný správně. To po nás ale druhý rok programování nemohou chtít. Nic hrozného, data šlo jistě ukládat separátně do dvou polí nebo naopak pěkně do slovníku. Zdá se mi, že na nás tehdy začali víc tlačit s používáním objektů a řekli nám jen o poli a Listu, jakožto zástupců kolekcí.
Jako druhé věci jsem si všimnul vlastní implementace metod, které tou dobou v .NET Frameworku byly – List.Contains(T) a List.IndexOf(T). Vážné nevím, jestli nám je prostě zatajili, anebo jsem nebyl dostatečně zkušený na to, abych je objevil ať už na MSDN nebo v intellisense a nebál se je použít. Řekl bych, že trochu od každého. Jednak se určitě kladl důraz na to, aby student vymýšlel vlastní algoritmy a trochu se do toho programování dostal a druhak jsem opravdu nebyl tak zvídavý jako dnes, abych se dobře seznámil s veřejnými členy typů, se kterými jsem pracoval.
Za třetí, zarazilo mě míchání českých a anglických názvů. To přisuzuji postupnému přechodu ze studenta, který opisuje kód z tabule k samostatnému programátorovi, který si začíná vytvářet vlastní styl psaní.
A nakonec, (ono to teda bylo hned po přečtení názvu metody PocetRuznychZnaku, ale chtěl jsem to nechat na konec článku) množství kódu. Taky si říkáte, že se to dá napsat v pohodě na jeden řádek a ještě efektivněji? (Všimněte si použití expression-bodied members z C# 6.0)
static int PocetRuznychZnaku(string retez) => retez.Distinct().Count();
Většina programovacích úloh pro začátečníky je tohoto rázu. Je to ale dobře? Je lepší dát žákovi sadu základních nástrojů a nechat ho znovuobjevovat kolo nebo je lepší na něj postupně navalit možnosti frameworku a naučit ho správně je kombinovat a k algoritmům sestupovat spíš než u nich začínat? Správná odpověď podle mě neexistuje, na každého platí něco jiného. Pozoruji na sobě, že u mě se tyto periody střídají. Začal jsem s algoritmy a poté mě doslova zavalili frameworky (WinForms, ADO.NET, ASP.NET). Po střední škole jsem se sám dostal zpět k jádru zkoumáním na čem tyto části .NET stojí, ale hned v prvním zaměstnání jsem byl opět zasypán frameworky a novými částmi pro mě již známých. Od té doby jsem se ale mnohem více začal zajímat o to, co leží úplně dole a občas si pro zpestření vezmu něco jako Roslyn a postupně procházím vrstvy počínaje abstrakcí, konče implementací. Taková kombinace pro mě perfektně funguje.
Vzpomínáte si na své začátky programování? Jaké byly?