Jenkov.com
542 subscribers
30 links
This channel contains news from Jenkov.com - such as new and updated tech arcticles, videos, tools etc.
Download Telegram
Channel created
Structural software design is IMO about how you structure your code base internally, meaning how you decompose it into smaller components, how you structure the interfaces of the components, and how the control flows between the components.

I have just published a short tutorial explaining my view on structural software design. I have also made a video version of that tutorial, for those of you that prefer video. The topics explained are still somewhat basic, but my software design series is starting to become more concrete at least, and soon also more advanced.

Structural Software Design - text:
https://jenkov.com/tutorials/software-design/structural-software-design.html

Structural Software Design - video:
https://www.youtube.com/watch?v=bj9DoZsu7Ls&list=PLL8woMHwr36HWMaOTIiWNf_fYYkZCHPxo&index=5r

#softwaredesign #softwareengineering #softwaredevelopment
Here are my notes about the SOLID design principles so far. I will probably be adding some comments to them over time, as I learn more about software design - but here is the first version:

https://jenkov.com/tutorials/software-design/solid.html
I have just published what I currently believe are the core principles of what I call " Conscious Software Design ". There are still more details that need to be added over time - but I believe these three core principles are what is most important:

- Understanding
- Pragmatism
- Trade-offs

I am explaining in more detail what I mean, in this tutorial:

https://jenkov.com/tutorials/software-design/conscious-software-design.html
I have updated the article above with a list of consciousness levels I believe we developers often operate at. These are:

- Oblivious
- Unconscious
- Subconscious
- Conscious

What exactly these levels mean is now described in the article linked to in the previous post!
If you are doing performance optimization in Java, sometimes you will need to write some "microbenchmarks" that measure how fast a given implementation runs. Doing that so that the benchmarks actually measures the implementation fairly - is not easy! The Java Microbenchmark Harness (JMH) can help you out here!

My Java Microbenchmark Harness (JMH) tutorial explains how to use it, and how to write micro benchmarks.

https://jenkov.com/tutorials/java-performance/jmh.html
I have made a video explaining my philsophy of Conscious Software Design in more detail. This is the design philosophy I have adopted over 25+ years of development.

Conscious software design is not focused on specific design techniques or doctrines, but rather on how to "think" about software design in general, meaning how to determine which design techqnue is appropriate in a given situation rather than just applying "clean code" or "hexagonal architecture" blindly.

https://www.youtube.com/watch?v=RrXZQLo1EOw&list=PLL8woMHwr36HWMaOTIiWNf_fYYkZCHPxo&index=4
My Polymorph Data Language is finally "ready" enough for public scrutiny ๐Ÿ˜Š
The work took a detour - so I ended up starting with 2 more parser friendly syntaxes - which are also relatively easy to parse in parallel (for more speed when needed). I have documented the first 2 syntaxes here:

https://jenkov.com/tutorials/polymorph-data/polymorph-data-language.html

I also have a third, more humanly readable / typeable syntax, but I am not sure it should be published. It's not as fast to parse, and hard (impossible?) to parse in parallel... why would we limit ourselves that much - just for a bit of extra readability? ... a bit fewer characters? Hmm... But maybe for small scripts it would be fine ( < 1 KB ) - as the performance difference might be insignificant in some such cases (small scripts parsed less often).

Polymorph Data Language (PDL) is an alternative to JSON, YAML, XML, CSV etc. which provides more features and is this more versatile than these other languages. Features, such as compact object representations, tabular data representations, object tree representations and cyclic object graph support.

PDL can also be converted to its binary counter-part Polymorph Data Encoding (PDE), which is even faster to process, and more compact on the wire / disk. PDE uses an encoding similar to MessagePack and CBOR, but with a few changes to support all the features I wanted (such as efficient tabular data, efficient object trees and cyclic object graphs).

I have spent a looooong time scrutinizing as many aspects of PDL and PDE as I could - to make sure it has good trade-offs in its design - suitable for as many use cases as I could think of.

Now I am ready for your scrutiny too - pointing out all the things I have missed ๐Ÿ˜‰ ๐Ÿ˜Š

#Polymorph #PolymorphDataLanguage #PolymorphDataEncoding #PDL #PDE

P.S. I learned a lot about tokenizer speeds in the process too! ... I'll write more about that too, some day ๐Ÿ˜Š
I will slowly start writing about other programming languages than Java too. In the beginning, probably Python and JavaScript as I am already working with these languages too - and in the beginning mostly the basics - the core elements. Then it will evolve from there ๐Ÿ˜Š
Today I have published my updated P2P Network Introduction video ๐Ÿ˜Š

This video introduces multiple different P2P network topologies, where my first video only introduced the ring topology used by Chord, Kademlia, Pastry and Tapestry. The new video also introduces my own P2P network topology which I call the Polymorph Polyring topology ๐Ÿ˜Š Here is the video:

https://www.youtube.com/watch?v=Vw9ynzuGNSw&list=PLL8woMHwr36F-1h7BE92ynHHOE3zebGpA&index=2
I've published a short tutorial on the core Python data types ๐Ÿ˜Š

https://jenkov.com/tutorials/python/python-data-types.html

As I said, I would begin writing about other programming languages than Java. Python is the first one so far, apart from a bit of JavaScript related tutorials (such as jQuery) ๐Ÿ˜Š
I have just published a video about the Java ForkJoinPool which makes it easy for you to break down a task into smaller subtasks recursively, so they can be executed in parallel - by the ForkJoinPool.

Additionally, the results (if any) of all the subtasks can be joined recursively into a single result again.

https://m.youtube.com/watch?v=aiwuJQt7YJU&list=PLL8woMHwr36EDxjUoCzboZjedsnhLP1j4&index=26&pp=gAQBiAQB

The Java ForkJoinPool was one of the most requested topics, so I finally gave in and made a video about it ๐Ÿ˜Š