TL;DR;
2009
Internship .I started with C# .net as my first programming language .by using Dnn 5 (dot net nuke) as framework I was amazed how fast can build up a website — within a week . code smith worked very well as ORM to generate our data layer. I was pretty much like a fullstack developer , other tech i was using are:
Asp.net ,MSSQL, javascript , jquery(it was a solid front-end library for many years), CSS , photoshop (yes, to chop large image into smaller pieces fast page loading). action script for flash programming .
learned :
As a developer , do not die with any language or tools ,should pick up new language (AS) or tools (photoshop) to solve a problem when neccacery .
Before talk about optimization (functional, code, performance), make it work first .
With proper documentation and good communication within team and with customer,waterfall could also make project success .
2010–2012
I worked with author <<WPF in depth>> (working at microsoft right now). We finished couple of (dev and dev-test) projects using :
C#, MSSQL ,PostGresql, load runner (for software dev test projects), UIAutomation (microsoft internal automation library), WPF, silverlight (before it goes) , WCF, arpc (an internal RPC framework, async all the way from web layer to DB ). MFC , Lisp and ObjectArx (for autodesk projects) , handlebarJS, extJS, nodejs
learned :
Test is assets , code is not ; async is the only pattern to go if your application is public facing ; C++ is complex , It will not be my first choice to finish the work unless i have no choice.
Technology changed rapidly , there is no best, they are just tools, we pick up whatever is suitable and finish the project .
There were 23 OOP design patterns ,i only find few of them useful in projects : adapter, decorator, chain of responsibility, pub-sub, simple factory, template, lazy, DI (some patterns not to simplify coding, but they made our structure more complex: bridge, visitor, etc) ,for microsoft projects, we went through MVC, MVP, MVVM as well, patterns or principles are just some ideas to structure or manage our code in a better way (for human).
also i saw many discussions on function programming with oop comparisions . no matter SOLID priciple or OOP or functional programming ,The objective of coding is same and simple: just to write code easier to read or make changes ,testable . make it working ,readable, then get better performance.
2013–2015
Sharepoint , Asp.net MVC 5, knockoutJS, angular JS , oracle , Azure (PAAS) , Azure Queue, Oauth, OpenID, MongoDB, MSSQL ,Redis
Lesson Learned :
NoSql is can not and maybe never replace Sql (for most cases) , it is complement for SQL.do not move to nosql because of performance (usually due to poor SQL query or index), it will not help you ;
cloud (except IAAS) will save you A LOT of time in hardware work (managing the Vms or docker images or configuring the ip address for VLan or switch, bridge machines, etc); The price is most likely about storage and network transactions,do NOT store logs in cloud storage (azure table);
javascript framework changed rapidly, do not tie your application to any of them ,angular (I researched a lot in handlebarjs, emberJS, knockoutJS, vueJs, reactJS as well) was popular but now it’s seems reactJs won the game , do not think much , just pick up whatever your team comfortable to work with and finish the work and keep in mind, what to do when it EOL.
There are many cloud design patterns here . I found the most useful ones are :Pipes and Filters , Pub/sub, Retry, Static Content Hosting(CDN) Throttling, CQRS + Event sourcing, Event Bus, Configuration store, Circuit breaker, Health Endpoint Monitoring
Do not use visitor pattern everywhere unless you want to complicated your code base.
As a developer , you need to pay attention to your health (both physical and mental) and join a gym start a workout plan ASAP , for a life long learning race.
2016–2020
Java , Swift, NodeJs, Python3 , Docker and kubernates, Azure ML, Google notification , APN (apple push notification) ,Xamadrin, phoneGap, ffmpeg, yolo3, opencv, emgucv ,cuda ,webrtc ,RabbitMQ, Kafka(with zookeeper) , rtsp, rtmp, postgreSQL, webGL, three.js, SVG .
Lesson Learned:
before you start android or iphone development it is important to understand the lifecyle of the android/ios app lifecycle(what are the functions provided by framework, how to navigate or get notification by APNS or google etc) , cross platform framework like xamadrin or phonegap can build simple apps , and thats all ;native apps still the only chioce in many cases .
Video stream/frame (realtime) processing(decoding) and storage (recording) is more chanllenging than text data processing, even though learning curve is very high, but this area is worth to explore this field, many interesting problems (specially video frame decoding and recording) ;ffmpeg and opencv is a solid library.
it’s good to saperate your report , aggregate(summary) data , modeling , transaction data , historical data , cold and hot data into different database .then you can support millions of rows ETL daily process (within 3 hours).
if have to go database sharding , try vertically first . (when master-slave, read-write can not fulfil)
spin up a child process is generally cheaper and faster in linux than windows .zoobie process is easier to detect and manage as well .
Docker is lightweight but is not a replacement for VM . it is not easy (specially kubernates) for developer to manage(configuration, deployment) their apps .
Software architechture always evolves with business requirement, there is never one-size-fit-all solution. Do NOT complicated your design for nothing .every one talking about microservice, but i only experienced once , we built a platform in 2012(we 200+ developers built> 5 years) , in most cases , it is overkill.
Software solution is all about balance : requirement/money/time/people
webrtc is cool ,but a bit slow (before reach 5G) when connecting many channels;
computer vision(FR (Facial Recognisation) and VCA (video analysis)) is too far to become a mature technology. still has a long way to go to be widely used (or never). you will have some fun in making some side projects or demo using faceDetection or YOLO . but do not use them in any projects .
there is no much fun in machine learning projects ,it still have a very very long way to go . to be mature and useful in real business requirement .there are ready platform like azure ML or amazon or google, even you use tensorflow or keras build the model and evaluate , the accuracy pretty much is depends on the data you have , and there is really no much fun from changing the parameters to fit best in a ML algorithm (i don’t find it fun in learning any of KNN, decision tree ,random forest, SVM, regression ,DNN etc ) with frameworks ,all you need to do is pass in the data, train the model and plug api to consume the model .every api call is either doing prediction some value or group into which categories . but this is not “learning” .
A lot of message queue coming during these years, we picked rabbit as its setup is simple and can adapt to more languages , (yes kafka can support higher number of writes per sec) but we do not need to support that much (no need manage a zookeeper as well).
webGL can create very impressive JS apps , but the performance to browser is its drawback . mixed with svg or threeJs could be a solution . do hope webassembly could come faster .
new frameworks or libraries are interesting to learn ,some faded very fast , some slow ,you should focus doing excellent work (write solid code, proper design) instead of being a fan to any framework or ecosystem, remember , pick up new things is to solve a problem or produce better results in your work (and if you mean a better performance, must measure it) .
In a good team is more important than money or role, remember, you need to work with your team for 8 hours a day, 5/7 days a week . good team itself means a lot of value. do not change a job just because salary raise.
Do not move to management path for money or higher role , you will be bored with the decision making and people management very fast , even worse, you may have to work with people without any technical background, talk a lot and explain everything , almost everyday, which is a nightmare .
2021
Centos, Php , Python , Golang, Flask ,Tornado, gunicorn, MarialDB , Nginx, Memcached , ec2….
Learned :
Linux is friendly to developers , script your things can bring more productivity. I like the file system, pipeline ,text stream command interface .
thought script language easier to get error than compile languages, however it is still much more convenient , you no need wait to compile, easier deployment;
Software engineering is a no ending learning game, keep leaning and practicing , you can not master in everything , just experience the fun of solving a problem and building things .
Go and rust eco-system (libraries, stackoverflow-QNA) still need time to grow and be widely used in today projects .
If you willing to step down from management role back to technical , mental stress will be reduced a lot . career is not about all how higher you can go ,most importantly , it is how you can find our your strength and keep doing well in your work , in a long run.
Last
Yes, you can still enjoy coding after 35 if you want as i do .
Thanks for reading .