Uhmmie schreef op donderdag 6 oktober 2022 @ 10:32:
Het begin van mijn carrière heb ik voornamelijk gewerkt met PHP en in mijn vrije tijd heb ik ervaring opgedaan in Java en C#.
Uit eindelijk vond ik C#/Dotnet het fijnste werken en ben dan ook gewisseld van baan. Ondertussen is dat alweer bijna een jaar terug en op zich bevalt het me nog steeds goed. (Generics en delegates zijn een verademing).
Daarnaast ben ik weer begonnen om aan wat eigen projectjes te werken, waarbij ik gebruik ben gaan maken van language-ext (aan de hand van wat YouTube tutorials). Omdat ik soms nog wat moeite had om bepaalde logica te volgen (op papier snapte ik het “prima”, maar zodra ik het zelf toeging passen liep ik toch regelmatig vast). Ben ik opzoek gegaan naar wat meer uitleg over bepaalde onderdelen van language-ext (voornamelijk het optimaal gebruik van Option/Some/None en Result).
Vervolgens zag ik hoe Rust dit oploste met hun unieke enums en pattern matching en was eigenlijk direct verkocht. Ergens kriebelt het nu weer om een nieuwe taal te gaan leren, maar gelijkertijd zie ik maar een beperkte mogelijkheid qua nieuwe baan (zijn er echt veel minder) en daarnaast blijf je op die manier junior, omdat je steeds switched van taal (zeker gezien rust toch wel een stuk complexer voelt).
Ik ben benieuwd hoe andere hiermee omgaan?
Ik heb nu 15+ jaar in allerlei research/prototype projecten gewerkt, en in een lange periode daarvan had ik ieder half jaar 1 of meerdere andere programmeertaal/technologie op een project. Je kwam niet op een project als C#/C++/Java/whatever-typmiep, maar om het project naar een hoger plan te tillen en problemen op te lossen. De focus lag veel meer op software best-practices, zowel op het vlak van het maken van de software als ook de project/process aspecten. Zeker in het begin was er veel laaghangend fruit op dat vlak... dingen als clean-code, SOLID, DI, MVVM waren destijds relatief nieuw en hip. Agile en Scrum waren nog "eng" voor projectleiders. Kanban had nog geen ziel van gehoord...
Ik ben nu sinds een anderhalf jaar met full-stack web development bezig met C#/dotnet core, Angular en typescript en python. Wat mij meteen op valt wanneer ik wat nieuws van de plank trek is de overlap met andere concepten die ik gebruikt heb. Zo zie ik Angular components als views in WPF en zet ik het in middels een MVVM patroon... althans... mostly. Ik kies er ook voor om niet de Angular commandline tooling te gebruiken om "components" aan te maken, omdat deze niet overeenkomt met mijn mentale model van namespaces. Ik maak ook een veel diepere directorystructuur dan andere frontend developers in onze organisatie... geen idee of dat goed of slecht is. Ik vermijd @injectable omdat ik het een anti-pattern vind om overal Angular-specifieke code doorheen te sprinkelen, en in plaats daar van initialiseer ik de DI-container bij het starten van de app.
Mijn punt is dat wanneer je de high-level concepten kent, en maar vaak genoeg tegen de muur bent gelopen in andere projecten, je leert wat werkt en wat je tegen gaat werken. Dan kun je ook met een educated guess afwijken van wat de tutorials je aanbieden.
En wanneer je wat nieuws tegen komt moet je ook een deep-dive doen naar de concepten en best-practices achter de tech/tool die je gebruikt.
Wat ook helpt is dat ik al veel technologieen die ik gebruik, ook van binnen ken. Zo heb ik in een stageopdracht een TCP+HTTP-stack geschreven voor een embedded platform. Of zelf smart-pointers gemaakt voordat Boost bestond... en dat was nog voordat het in C++ zelf opgenomen werd. Deze kennis helpt dan weer als ik een "memory-leak" in C# tegen zou komen.
Dat is het voordeel van een "dinosaurus" zijn, maar ook het verschil tussen technologie gebruiken, en de technologie begrijpen.
En niet bang zijn om fouten te maken. Ik heb best wel wat keren echt fundamentele fouten gemaakt omdat ik de technologie niet goed genoeg kende. E.g. Entity Framework (EF) objecten gebruiken als business objecten door de hele applicatie heen... because we can... want "partial classes"... niet realiserend dat hun lifetime/threading/updating geregeld wordt door EF.
Wanneer ik weer eens gegenereerde POCO's tegen kom dat ben ik op mijn hoede.
Anyways, dat was een beetje off-topic, maar senioriteit/junioriteit is geen kwestie van hoe snel je if's en else's kunt typen in een bepaalde programmeertaal. Het gaat er om hoe goed je in staat bent om problemen op te lossen en dingen werkend kunt krijigen.
Moderne "software engineering" jobs/processen nemen (als je niet uit kijkt) een deel van dat groeitraject weg: dat wil zeggen, wanneer je alleen maar userstories mag kloppen en alleen maar op je eigen postzegel mag werken, dan ga je niet de overkoepelende concepten herkennen en weten hoe fundamentele keuzes gemaakt worden door de designer/architect. We leren door fouten te maken, en wanneer we in een silo werken dan dan maken we die fouten niet... Sommige van die fouten kunnen best dure fouten zijn, maar ze zijn nodig om te groeien.
Een interessante blogpost
hier gaat over de neveneffecten van Agile/Scrum en hoe dat iemand vast kan zetten in junioriteit. Ik ben een voorstanden van Agile om risico's en voortschrijdend inzicht te managen, en een gedeelde verantwoordelijkheid te creeeren (voornamelijk om de projectleider mee te laten delen, ipv alles maar af te dwingen middels "commitment"). Maar met mijn lekenkennis van psychologie en groepsdynamica zie ik steeds meer negatieve effecten op o.a. groei en kwaliteit. En Scaled Agile is al helemaal the root of all evil.