Migrate, Modernize and Build Java Web Apps on Azure: This live workshop will cover methods to enhance Java application development workflow.
Modern Digital Website Security: Prepare to face any form of malicious web activity and enable your sites to optimally serve your customers.
Stats
Reputation: | 6912 |
Pageviews: | 1.7M |
Articles: | 56 |
Comments: | 261 |
Articles
Trend Reports
Low-Code Development
Development speed, engineering capacity, and technical skills are among the most prevalent bottlenecks for teams tasked with modernizing legacy codebases and innovating new solutions. In response, an explosion of “low-code” solutions has promised to mitigate such challenges by abstracting software development to a high-level visual or scripting language used to build integrations, automate processes, construct UI, and more. While many tools aim to democratize development by reducing the required skills, others seek to enhance developer productivity by eliminating needs such as custom code for boilerplate app components. Over the last decade, the concept of low code has matured into a category of viable solutions that are expected to be incorporated within mainstream application development. In this Trend Report, DZone examines advances in the low-code space, including developers' perceptions of low-code solutions, various use cases and adoption trends, and strategies for successful integration of these tools into existing development processes.
Modern Web Development
The web is evolving fast, and developers are quick to adopt new tools and technologies. DZone’s recent 2021 Modern Web Development survey served to help better understand how developers build successful web applications, with a focus on how decisions are made about where computation and storage should occur.This Trend Report will help readers examine the pros and cons of critical web development design choices, explore the latest development tools and technologies, and learn what it takes to build a modern, performant, and scalable web application. Readers will also find contributor insights written by DZone community members, who cover topics ranging from web performance optimization and testing to a comparison of JavaScript frameworks.Read on to learn more!
Data Persistence
At the core of every modern application is an endless, diverse stream of data and with it, an inherent demand for scalability, increased speed, higher performance, and strengthened security. Although data management tools and strategies have matured rapidly in recent years, the complexity of architectural and implementation choices has intensified as well, creating unique challenges — and opportunities — for those who are designing data-intensive applications.DZone’s 2021 Data Persistence Trend Report examines the current state of the industry, with a specific focus on effective tools and strategies for data storage and persistence. Featured in this report are observations and analyses of survey results from our research, as well as an interview with industry leader Jenny Tsai-Smith. Readers will also find contributor insights written by DZone community members, who cover topics ranging from microservice polyglot persistence scenarios to data storage solutions and the Materialized Path pattern. Read on to learn more!
Comments
Jul 17, 2023 · Thomas Hansen
When you're on a time schedule, you don't have time to "browse", but you need "fast information" - StackOverflow is better than WikiPedia here, but not optimal. WikiPedia is a hot smoking pile of garbage here ...
Jul 17, 2023 · Jasper Sprengers
The title is spot on!!
Jul 13, 2023 · Thomas Hansen
Thx Michael :)
As to your question; I don't know? What do your startup do?
Jul 11, 2023 · Thomas Hansen
The source parts is a crucial part of its implementation yes ^_^
Jun 14, 2023 · Thomas Hansen
Thank you :)
Apr 19, 2023 · Thomas Hansen
Thank you, we are an amazing team yes :)
Dec 01, 2022 · Thomas Hansen
Did you fork Hasura ...?
Sep 28, 2022 · Thomas Hansen
Hehe, I never did c64, my thing was Amstrad CPC464 ... :)
Sep 28, 2022 · Thomas Hansen
Najs one, you really found your thing, just like me - And yes, it's really that "simple". For the youngsters out there, I can only reiterate what Sergio said; Keep on coding ;)
Apr 05, 2022 · Thomas Hansen
Interesting. I'd never dream of using anything but some distributed things such asCassandra for such things. Thx for the info ...
Mar 26, 2022 · Thomas Hansen
Brute force intrusion is only one aspect of the problem. Google Rainbow Dictionary Attacks ...
Mar 10, 2022 · Thomas Hansen
Well, the whole idea is kind of to get rid of rules and validators, to allow for people to create passwords with maximum entropy the way they see fit themselves - But yes, thank you :)
Mar 09, 2022 · Thomas Hansen
The exponent becomes numbers of entities, the base your entities permutations. With a passphrase I assume stuff such as "foo bar howdy world hello barn" - At which point your base is "number of words in English language" and your exponent "number of words" (6 for my example) - Equalling 460,000 to the power of 6, becoming an *INCREDIBLY* large number, so yes a passphrase (assuming we agree upon what they are) would help here ... ^_^
Mar 06, 2022 · Thomas Hansen
Well, that's one example ...
Feb 11, 2022 · Jasper Sprengers
Luved it. I remember when I first read Joel's blog, and I so insanely disagreed with his conclusion I think a broke a couple of keys on my keyboard in the process. This is a much better middle ground I'd say :)
Dec 15, 2021 · Thomas Hansen
Sorry, it was bought last year ...
Dec 15, 2021 · Thomas Hansen
Offsets are 10, limits are 10, besides from that, the above is the exact queries. The "x, y, z" parts are every single column in the respective tables, in alphabetical order ...
Dec 15, 2021 · Thomas Hansen
The queries are simple "select x, y, z from q offset w limit e". The first paging does an inner join on both referenced fields, and ads the first text column it finds from the joined table.
Dec 15, 2021 · Thomas Hansen
You are correct, and I say these things out multiple times, both in the video, and in written text. However, to test millions of records, I'll need a database with millions of records. I don't have that database, especially a database that is the exact same in both PgSQL and MySQL. So doing such a test would be impossible for me.
When that is said, I would expect PgSQL to outperform MySQL if tuned correctly, with millions of records. However, I would also expect PgSQL to outperform MySQL in this test ...
Nov 11, 2021 · Daniel Stori
Too funny, I just spent a couple of hours in a meeting with my Head of Development discussing this very subject ^_^
Nov 07, 2021 · Thomas Hansen
This doesn't have anything to do with closure, although (some) of the function objects stored this way does use closure yes, but these are two different things. I'm not sure it has a name to be honest with you. However, as I wrote the MSDN/Microsoft article, I referred to these buggers a "symbolic delegates", since they share (some) traits with symbols in Lisp ...
It's a way to refer to function objects of generic character through strings, and that's it really ...
Ridiculously simple, and ridiculously powerful :)
Nov 04, 2021 · Thomas Hansen
Well, there are a couple of reports referenced in Randy's book "The art of assembly programming" (CISCx86) - Where he makes a case for that assembly programming is superior, since it (only) results in +30% larger codebases ...
Nov 04, 2021 · Thomas Hansen
"Emphatically disagree here."
This is really quite irrelevant, there's literally hundreds of research papers about the thing.
"That's like saying larger houses are harder to keep upright. Sure, it's true. But maybe you should work on the design, so it can stand on its own and not fall down."
Or maybe find some method to work smarter. 100 years ago people built cars manually. It took 18 months to assemble a car 100 years ago, and ~50 people manually working on it, 60 hours per week - I assume you understand where this is going ...
... just sayin' ... ;)
"Making the houses "smaller" doesn't solve the problem"
If this was true we'd all (still) be working in assembly code ...
Nov 04, 2021 · Thomas Hansen
"If your point is that OO is not suitable for small scripts, I may even agree with you there."
There's been hundreds of studies about this, and they all conclude with the same, which is that number of lines of code decides workload required to maintain and develop your app. Implying, reducing LOC reduces resource requirements. If "small scripts" are more adequately rendered in non-OOP languages, than (almost) everything is more adequately rendered in non-OOP languages ...
Less code, less work, less resources, less expensive solutions. Less expensive solutions, higher ability to compete. Higher ability to compete, more profit! ^_^
Nov 04, 2021 · Thomas Hansen
How can you do that with OO? And if you can, how can you do it securely? And if you can, how can you do it within a timeframe required for a micro HTTP request ...?
"If your point is that OO is not suitable for small scripts, I may even agree with you there."
Bingo!
"So is Magic an Enterprise Server with its own language then?"
I'm not sure what to refer to it as, but it simplifies your job. Cloud System, CRUDifier, automation tool - I've gone through the whole dictionary without finding an adequate category for it ... :/
If you've got suggestions, feel free to toss them into the debate ... ;)
Nov 04, 2021 · Thomas Hansen
Not too far away from the truth, but of course the key give away here is automation, automation and automation - With the intention of making the end developer more productive ...
The thing is built in C# and .Net Core though, not Java ...
As to Nomads and Lambdas ==> https://www.youtube.com/watch?v=rrFrvrc0KYE
Now try to do this with OOP ;)
I created this video explicitly for you just now ...
Nov 04, 2021 · Thomas Hansen
Psst, did you check out Magic ...?
Try it out, it's got Docker images, allowing you to install it and configure it in 5 minutes, at which point I'm fairly confident in that you'll see something you can't achieve with Java. As to Nomads, check out the "Crypto" menu item, allowing me to pass code to a 3rd party server, and have that code executed, in a secure context, without even in theory being able to execute malicious code ...
Then imagine having any random client on earth providing a Nomad object to your server, executing that code on your server, without any security risks ...
... without any compilation requirements, and without any particularly large overhead ...
And yes, it's real ...
Nov 04, 2021 · Thomas Hansen
"functional languages had those first"
Actually, it means everything ... ;)
"I feel I can write better OO since lambdas are a thing in Java"
Lambdas are a part of Java, but not a part of OO ...
The problem I'm getting at is to stop thinking (exclusively) in terms of OO ...
Nov 04, 2021 · Thomas Hansen
Hahaha - Too funny :D
Nov 03, 2021 · Thomas Hansen
I am not equating OOP with SOLID, what I am claiming is that if you need best practices such as SOLID and Design Patterns, this is a symptom of that something else is wrong. Perfect things doesn't require a "manual", Design Patterns and SOLID is a "manual". However, yes it is a bit flamebait'ish in nature, and I don't honestly believe everything I say, but the problem I am trying to pinpoint is that OOP doesn't solve everything, and that sometimes it is required to think outside of the box. Too many believe OOP is the one stop shop to solving all their problems though, and an article such as this, might make them change their minds about it ...
... at least these were my hopes ...
Nov 01, 2021 · Thomas Hansen
Interesting library. I see his first commit was the 19th of March 2014. This was 5 almost years after I first conceptualised Active Events in the (open source) project referred to as Ra-Brix. When I later got to write an article about it at MSDN magazine (2017), nobody had heard of it, to the extent of that Microsoft's editor had to write a "possible fruit cake warning" in order to publish the article, since "nobody" had seen it before ...
https://docs.microsoft.com/en-us/archive/msdn-magazine/2017/march/patterns-active-events-one-design-pattern-instead-of-a-dozen
An article that BTW was "destroyed" by its readers, proclaiming I was (more or less) crazy ...
Interestingly, all of you guys, every time you comment, seem to register your accounts the same day you comment on my posts may I add too ...
Oct 30, 2021 · Thomas Hansen
Psst ==> https://dzone.com/articles/you-only-need-one-design-pattern
Oct 28, 2021 · Thomas Hansen
No, best practices is to select Entity Framework's NuGet package in your references, for then to click delete on it!
Oct 28, 2021 · Thomas Hansen
Thank you, I am sure the developers over at StackOverflow doesn't know this. Go tell them please ^_^
Oct 28, 2021 · Thomas Hansen
Psst ==> https://www.youtube.com/watch?v=wksUdX59EDo
... ;)
Oct 28, 2021 · Thomas Hansen
"and telling that it sucks when they don't use it properly"
Great, now go tell the developers at StackOverflow they're wrong, and that their 15+ years of experience in these regards are wrong ...
Oct 28, 2021 · Thomas Hansen
Hyperlambda is Turing complete, and for the things you can't do with Hyperlambda, it's easy to create C# bindings to it. One attribute, one interface, with one method, and you're invoking C# code from Hyperlambda ...
Oct 26, 2021 · Thomas Hansen
Yet again, you can use EF this way. However, scattering your controllers with DbContexts is an "anti pattern", and what you would typically do, is to use for instance the Repository Pattern. If you wanted to, you could even do SqlQuery, or Connection.Execute, etc - However, then you're no longer using an O/RM library, you're using a very, very, very expensive SqlConnection and SqlCommand ...
StackOverflow had to throw out Entity Framework for these exact reasons ...
Oct 26, 2021 · Thomas Hansen
You're a great developer Atle, and you've obviously invested heavily in Entity Framework, and I must assume you know what you're talking about. I am sure you're a pride to your employer, and that you spend a lot of time trying to create great code, applying good architectural principles, leveraging your existing knowledge about subjects to the best of your abilities - Which are probably very high may I add ... :)
... however, there exists many ways to boil potatoes. Don't believe you know "the one and only best way to achieve the end result". I provide one (different) method here, which has some advantages, and some disadvantages. If you want to however, there's nothing preventing you from using EF in Hyperlambda ...
My piece of advice to you though is; Spend less time defending your existing "holy cows", less time quarrelling, and more time teaching yourself "alternative methods" to ensure the brightness of your future ... ;)
I've got 39 years of software development experience (from the age of 8), I'm not an idiot, and I might have a couple of good ideas for you, making you a better developer in the end - Which was my goal with this article ...
PS!
Jeg er også Norsk ... ;)
Oct 26, 2021 · Thomas Hansen
You provided an example where you opened the database connection once, saying that opening a database connection outside of the loop was wrong. I told you I am opening the database connection 1,000 times in both Hyperlambda and in EF. As to the read before update parts in EF, I have explained it thoroughly many times - Both in the article itself and in my original comment to you. If you don't believe this is the general patterns used to consume EF, I suggest you check out your own code in your own solutions, at which point I can pretty much guarantee you with 99% certainty that you will realise your own code is doing this itself!
... and if it is not doing this, you are violating best practices and architectural design patterns related to EF and O/RMs ...
Hint; It's not even possible in theory to use Repository Patterns (best practices) in EF without ending up with code like this ...
Oct 26, 2021 · Thomas Hansen
I am doing the same thing in Hyperlambda, so the comparison is correct. My reasons for doing 1,000 iterations is to make the overhead of the HTTP request itself irrelevant. As to your "UpdateFromQuery" parts, yes, this is possible to avoid selecting the object first, but rarely done, since people "wants to have the OO model", and "selecting the object first is so bloody convenient".
When we measure things, it's pointless to measure the best and optimised solution. What we need to measure is how people end up using it. I've seen hundreds of EF solutions, and they all end up having stuff such as DAL, Repository Patterns, etc, etc, etc - Typically resulting in having to select the object before updating it.
However, I am opening 1,000 database connections in the Hyperlambda version too, the exact same thing I'm doing in EF, and this is crucial to measure EF's overhead. If I hadn't done this, any differences would "drown" in the overhead of my HTTP invocations ...
So I AM measuring the same thing here, as in apples versus apples, simply because I am measuring the following two things ...
1. How to use Hyperlambda using its best practices, and how you'd typically end up using it in your own code.
2. How to use Entity Framework using its best practices, and how you'd typically end up using it in your own code.
Apples versus apples ...
Oct 23, 2021 · Thomas Hansen
No, Node is a graph object. It's the object representation of Hyperlambda. And it's not dependency injected.
Oct 23, 2021 · Thomas Hansen
Node is the input to the Signal method. It's a graph object, and the (single) object passed into all Signal invocations.
Oct 23, 2021 · Thomas Hansen
http.get:"https://x.com"
---headers
------X-Foo:Bar
Not sure how to figure out code view in comments. Replace "-" with SP ...
Oct 22, 2021 · Thomas Hansen
I think I am quoted in the C++ std, and I started coding in assembly 33 years ago, on an Amiga 500. There's a link on Bjarne Stroustrup's homepage to my GUI library as an example of "how to correctly create a GUI library for C++", and I have written 6 articles for Microsoft about C#. I think I know more about "levels" than you ...
... compared to Hyperlambda, C# and Java is the equivalent of CISC x86 machine code ...
Oct 22, 2021 · Thomas Hansen
Besides, you (probably) just proved me right in regards to "bad investment syndrome" ...
Oct 22, 2021 · Thomas Hansen
Most of my career I've been cleaning up over complicated, astro architected code, that was originally devised because of over complicated, way too flexible APIs, resulting in entangled spaghetti and garbage results, due to misunderstandings related to library consumptions and SDKs. Respectfully, but I think I am entitled to do a little bit of "self-entitled whining" ...
But yes, I am very passionate about bad code ...
Did you see the video? If so, feel free to prove e wrong though ...
Oct 18, 2021 · Thomas Hansen
Well, it's also about being honest too I think. I'm playing around with an article in my head that'll be named "How the slowest programming language became the fastest", etc ...
Thank you :)
Oct 18, 2021 · Thomas Hansen
Hehe, I thought you'd say "Pan Galactic Gargle Blaster", my favourite from the other side of the universe ... ;)
Oct 14, 2021 · Thomas Hansen
Almost 2,000 people read the article, at least one took the time to like it, and my GitHub repository got 5/6 additional stars due to it, so somebody obviously liked it. If you don't like Low-Code you are free to read something else here. Most Low-Code articles use it in their header, including this one, which makes it easier to scroll past it, and find other articles. I personally don't like Python for instance, but it's not a problem for me, I just avoid reading articles with Python in the header ...
If you could inform me exactly what is bad about Magic I would appreciate it though, such that I could have the chance to fix it ^_^
Some other guy told me about 4 things he was missing in Hyperlambda, 10 hours later all his features was in its GitHub repository :)
Sep 22, 2021 · Lipsa Das
Lovely writeup, but you should have added not automating repetetive tasks, possible to automate ...
Sep 20, 2021 · Tyler Hawkins
Very interesting read!
Sep 10, 2021 · Thomas Hansen
Hmm, I am (vaguely) acquainted with Shoi Sjiba (did I spell that right?) and Lean as used by Toyota, but I haven't heard about Lean Startup - Sound of me googling ... ;)
No worries, if most people were only half as polite as you in their constructive (and accurate) criticism, I'd see world peace easily within grasp of a couple of weeks ... ;)
Sep 10, 2021 · Thomas Hansen
Better ...? ^_^
Refresh the page and check out the initial disclaimer ...
Sep 10, 2021 · Thomas Hansen
I removed CI/CD from the checklist at the bottom though. Thx ^_^
Sep 10, 2021 · Thomas Hansen
Well, the idea with the article wasn't really to teach Scrum, something I'm fairly honest about I'd say - But rather to be as pragmatic as possible, mentioning some parts of Scrum, and doing as little of it as makes sense. In a way the article is an argument against dogmatic behaviour, which our industry unfortunately is full of. Scrum is nice, a good process, but I spent half my day at one of my former jobs in "standups" and "grooming sessions" ...
And yes, I know it's not the way standups or grooming sessions are supposed to be executed, but unfortunately it's the way it often is implemented ...
Clouds are mentioned for two reasons
1. My own "political views" about them
2.With only GitHub we have no real "boards", only a "TODO list", which kind of makes it impossible to correctly implement backlogs, sprints, user stories, etc ...
I didn't mean to cause any harm towards Scrum though, and I am sorry if it came across that way, it was not my intention. Thank you for wishing me good luck - The same back to you :)
Sep 03, 2021 · Dan Lines
Thx Dan, always ^_^
Aug 29, 2021 · Jasper Sprengers
"Yet I enjoyed every minute of weaving that basket while it lasted"
Beautiful ending ^_^
Aug 29, 2021 · Jasper Sprengers
Hehe, najs one, but I don't really like Woody ... ;)
Aug 24, 2021 · Jasper Sprengers
Well, Dali did it to show his opinion about Andy's piece, from his usual artistic directions my I add though - But yes, art today is arguably based upon "the bigger fool's theory".
I saw some researchers trying to mimic Jackson Pollock once. They could never get "the swing" quite right, until they dragged a dead drunk homeless guy off the street. It showed how "the swing was in the whiskey", quite literally ...
Aug 24, 2021 · Jasper Sprengers
Interesting edge and a very good article. I tend to refactor again and again and again in my open source projects, in an attempt at carving out "the perfect code". However, when it comes to art, I often use Andy Warhol as an analogy for what I'm trying to do with things such as Magic Cloud. I presume you "get it" without me explaining it ... ;)
However, one of my favourite stories is about the relationship between Warhol and Dali. Warhol once gave Dali one of his artistic paintings. Dali zipped up his pants and pissed on it in public. One can only wonder if the thing gained more or less value afterwards ... ;)
Andy of course was laughing as Dali was doing this for the record ^_^
The idea was that art isn't really art if it can be Xerox copied. So to Dali the thing was garbage. Today Andy's stuff sells for 100 times as much money as Dali's stuff ... ;)
Aug 22, 2021 · Thomas Hansen
Here's the app demonstrated on an iPhone, which (obviously) is a pre-requisite ... ^_^
https://www.youtube.com/watch?v=_upqXBkJcNk
How's it going? You should be having most of this done soon I presume ...?
Aug 21, 2021 · Thomas Hansen
"Let me know when you're done, and we can compare our projects "
It's Saturday today, go for it - I assume you'll be showing me your product then on Monday sometime ^_^
The database can be found at MySQL's website. It's called Sakila ... ^_^
Aug 21, 2021 · Thomas Hansen
"You claim that an average developer writes 750 LoC"
This is the TOP figure. Check out the science yourself if you mistrust my figures ...
https://dzone.com/articles/programmer-productivity
It also echoes my experience in general having worked for 20 years, managing dozens of developers myself. Sure, some projects are producing more LOCs per month, and some people are producing more. Especially initially in projects. But these are the official numbers, found by doing research over thousands of projects, ranging from all different industries, with hundreds of different programming languages ...
"bootstrap, and I believe that I could come up with it on the weekend"
Good luck. Here's the site in production for comparison reasons ^_^
https://sakila.servergardens.com/
Here's the GitHub repository if you want to see how it's wired together.
https://github.com/polterguy/sakila
Features assumed ...
* Secure login, securely storing passwords, using slow hashing, and individual per record based salts
* Audit logging in the database, allowing the user to peek into errors and other types of log entries
* 27,000 LOC of Angular code, with authorisation guards, a login form, and an individual Material Table for each CRUD entity in the database
* Referential integrity for all fields having such
* Etc, etc, etc ...
Let me know when you're done, and we can compare our projects ^_^
Aug 16, 2021 · Thomas Hansen
Maybe your words would carry meaning if your name wasn't "hello world" and your bio "test, test" - Just sayin' ... :/
Aug 15, 2021 · Thomas Hansen
Ford was obsessed with time, standards, and speed. If I'm to succeed with this, I need to keep that same focus. I've got 3/4 jobs in my pipeline currently, that all are great fits, although "stretching" the platform. However, the way they stretch it, is that the give me ideas for additional plugins and modules, I can reuse in future projects - Which is another scary place in such a regard, since over time, this implies that Low-Code gains more and more land. If it will ever end, I am not 100% certain of to be honest with you ...
... hence my former article about the idea ... :/
Aug 15, 2021 · Thomas Hansen
The primary inspiration for me personally doesn't come from software, but is Henry Ford. He famously said; "You can have Ford in any colour you wish, black or black". This was because black paint dried in half the time, so he refused to paint his cars in other colours. Using the process for something it's not intended to be used at, only results in very, very, very bad results ...
If somebody comes to me and asks me to create "something that looks like their existing system", I hope I have the courage to tell them; "Good luck, over there is our 'competitor'" ...
Aug 15, 2021 · Thomas Hansen
Well, the average (human) software developer can create between 325 and 750 lines of code per month according to research in the subject. Magic, and I presume also other similar scaffolding tools, reading meta data resulting in code, can produce 750,000 lines of code per second.
Of course, the comparison is not entirely correct, but even if you accept the notion of that this simplifies the development process by 50%, the time savings are obvious - Typically, according to my experience in the subject, it eliminates more than 80% of the job - At least for the type of work we do, and every time I add another feature, the portion of automation increases.
I just wrote an article about an example use case, where I break down the numbers for a specific use case, arguably illustrating how Magic is 38,543,995 times faster than a human software developer. All other factors set aside, that becomes 7 orders of magnitudes faster.
https://servergardens.com/blog/we-are-10x-on-everything/
Yet again, as I also admit, exclusively focusing on these numbers is not correct, since "Low-Code" still implies manual work afterwards by a human developer, increasing the Time2Market.
However, I am certain enough about the figures having (obviously) used Magic myself for a long time, that I can guarantee that we're 10 times faster, delivers 10 times higher quality, for 1/10th of the price that others can deliver - ASSUMING the software our clients wants lends itself to a Low-Code type of process. And if it's not, we advise our clients to seek help other places.
However, if you're about to create a database centric software system, where CRUD is a large part of your problem domain, we guarantee you that we (Low-Code that implies) can deliver it 10 times faster, with 10 times higher quality, 10 times more secure, for 1/10th of the price, 10 times faster. This includes manual work after the automated process has done its parts. This is exactly one order of magnitude on every single measurable parameter.
But yet again, the process doesn't lend itself to all software projects, only a specific range of projects - Typically CRM system, backend administration apps, database centric apps, etc ...
... which just so happens to be 80% of the "space" I have historically been working with as an enterprise software developer ...
In Norway IBM ran a project for half a decade for the government. The project cost the Norwegian government 340 million EUROs, and in the end the project was scrapped, because IBM couldn't deliver. This was a database centric application (EPJ, Electronic Patient Journal). If I had started out the project as a BDUF project, designing the database model up front, assuming I was able to get the database model correct - I could have delivered the project in 5 seconds ...
For some domains, the advantage is simply too large to ignore ... :/
Aug 15, 2021 · Thomas Hansen
I see your point, and yes, I could definitely do a better job at explaining what it cannot be used for. The above "FUD" though, is not special for Magic, but all Low-Code systems - At least in theory ...
Realise, a typical Low-Code component is reused in hundreds of different systems, implying the resource requirements to extend upon it can be shared to a much larger extent than a similar component created explicitly for a single software project.
It's the same argument as "library code". Typically library code is 1,000 times better on quality than a custom solution rolled out for one product. So it's much less "FUD'y" than you think.
Aug 15, 2021 · Thomas Hansen
Hmm, I see your point, but it wasn't intended as a product placement, but rather a general idea about Low-Code. The video illustrates this to some extent though ...
Thank you :)
Aug 13, 2021 · Kevin Montalbo
Very clear explanation. Luv it ^_^
Psst, follow my profile to see my thoughts, and tools in this space :)
Aug 13, 2021 · Lauren Forbes
Thx mate, I try ^_^
Aug 13, 2021 · Thomas Hansen
Respectfully, but you missed the point. A decade ago I saw figures concluding with that there was roughly 26 million software developers in the world. Although the number has probably increased since then, I suspect the ratio is similar, and the ratio was that 21 million of these were "enterprise software developers", who's jobs were 80% delivering backend administration types of apps, such as custom CRM systems, custom ERP systems, CMS backend systems, etc - This job can now be done in 2 seconds, implying 22 million software developers needs to look for alternative tasks, or be considered "redundant".
As to your question; No, you cannot develop a kernel using my product, and I have no plans to create such features in the future either. You cannot create a plugin for FireFox either, and neither can you create a computer game, etc, etc, etc, etc. In fact, there are 4 million things you cannot create with my system, and I will probably never implement support for solving these tasks either - Which doesn't change the facts that there are still 21 million things you can create with my system ...
As to legacy apps? Why keep legacy apps around at all if you can replace them with a modern code base, a good architecture, applying 100 times better security, scalability, and performance in 5 seconds ...?
... and use the existing database ...?
I have worked most of my career on "legacy apps", and my yearning for burying these things, due to garbage code base, applied by sub-optimal developers, having hacked away for decades, in multitudes ranging in the hundreds - Often started by junior developers, with absolutely no knowledge about how to correctly create software, was actually my primary motivation to creating Magic ...
There is nothing "magical" about legacy code, granting it "the right" to exist ...
Things have justified lives because of "function". Once there is no more function, there is no more existence ...
Magic, and hundreds of other systems, eliminate this "function" ...
Aug 13, 2021 · Lauren Forbes
Bookmarked to use for future references. I was surprised by content length ... :)
Aug 12, 2021 · Chris Fanchi
Congratulation on your release - Amazing product :)
Aug 12, 2021 · Kostas Karolemeas
"The platform shouldn’t lock them into proprietary technologies"
One of many items showing an amazing insight into the problem domain - Najs writeup!
Aug 12, 2021 · John Vester
As usual, pure brilliance from the humble guy, refusing to take credit, always staying to the facts ^_^
Aug 12, 2021 · Thomas Hansen
100% of the project is Open Sauce - Including "magic.core" - Which doesn't exist, and never has existed - However, I assume you refer to "magic.signals" which was closed source, but became 100% Open Sauce roughly 6 months ago ...
Aug 12, 2021 · Thomas Hansen
And, while we're at it; One person created Facebook, one person created Google (Larry) and one person created Microsoft (DOS that was originally named QDOS) and one person created Apple. One of these are already retired, another is unfortunately dead (Jobs), but their legacy is still kicking last time I checked ^_^
Facts are; "One man" arguably created EVERYTHING you adore so much ...
Like it or not, it's the truth ... :/
And none of them chose "the middle of the road" solutions of their times ...
Aug 12, 2021 · Thomas Hansen
"One person" created Linux, its adoption rate makes MSFT look like "noobs" ... ;)
"One person" also created cURL, it's got some 1 billion installations around the world or something ...
"One person" also created GIT, which 99% of all source code is managed through ...
Just sayin' ... :/
Aug 11, 2021 · Ugur Kadakal
I agree, and obviously it depends upon your perspective - I just felt the need to apply mine ... :)
Aug 11, 2021 · Thomas Hansen
I wouldn't be so bold as you are, but yes, I see your point here ^_^
However, the stuff I'm doing in Magic today, and that I'll release a couple of days down the road, most people would say "it's impossible" in regards to a few years ago ... ;)
"Change is the only constant" ...
Aug 11, 2021 · Ugur Kadakal
Great writeup - However, what type of project depends upon your tool of choice. The one I created was exclusively created for backend administration type of apps, such as CRM systems, etc ...
You should check out my profile about it ^_^
Aug 10, 2021 · Pallavi Sengupta
Awesome article Pallavi. You should follow my profile, to see my thoughts about this ... :)
Aug 10, 2021 · Thomas Hansen
The Linux is already written. 99.99999999999999% of all software developers do not work on the Linux kernel, they work as enterprise software developers.
Aug 06, 2021 · Thomas Hansen
When non-DotNet developers asks me if .Net is good, I answer; "Very good, but your primary task as you start using it, is to figure out which parts NOT to use" ... ;)
There's a LOT of garbage out there - I assume the same is true for Java ... :/
Aug 06, 2021 · Thomas Hansen
Hehe :D
The problem is that typically it's the "junior guys" who starts the projects, due to budgeting issues. Only once it's slightly successful people like me and you come in, at which point it's often too late to salvage, because the thing has turned into a "living porridge monster" ... :/
As to "generic versus specialised problems"; Most of the stuff I have done in my "day jobs" are generic problems, industry segment here is almost completely irrelevant. Now of course, I've been an enterprise developer most of my life, but I've seen hundreds of different email sending services, translation services, registration services, authentication services, etc, etc, etc - And they ALL have one thing in common; Garbage code!
For instance, I once ran the most popular .Net based OAuth2 project through SonarQube, and it reported thousands of security issues ... :/
(None mentioned, none forgotten)
Having security issues such as the above in your authentication and authorisation code, implies you HAVE NO security, which I assume you agree in regards to ...
A qualified guess is that 80% this code could easily be shared, without needing to know anything about business logic or special requirements. And even if the numbers aren't 80%, they're definitely so large that they're useful to pursue from a financial perspective ...
Reinventing the wheel is status quo, at least in my parts of the world, and it's quite frankly a ridiculous thing to do. I assume you agree here ... :)
Aug 06, 2021 · Thomas Hansen
First paragraph - Hahahaha, I was taking "the polite" direction. I see you're not ... ;)
Second paragraph. Yup, there's a lot of garbage out there. I'm not a Java developer, but I can testify similar effects in the .Net space.
Third paragraph - Maybe, but most people are NOT you!
Fourth? I have no idea what you're talking about, but it sounds like a garbage implementation of IoC and dependency injection in the .Net space, which actually is one of its incredibly beautiful parts ...
Last paragraph - Yup, but people don't have the time. Create your own logging framework, as your CEO is pounding on your head asking for the latest "deposit module", and come back and tell me "it was a success" ...
It's about TIME, and that's WHY software becomes garbage. Eliminate the time aspect, and everything becomes beautiful. My company know how to do that, because our business is common commodity modules, all projects needs, but few have the time to implement ...
Aug 06, 2021 · Andre Lee-Moye
Love it Angela, if you follow my profile, you'll see we might have some synergies related to this field ^_^
Aug 05, 2021 · Thomas Hansen
As to Time2Market. The entire notion of the article is to reduce it, without compromising quality ...
Aug 05, 2021 · Thomas Hansen
The "resume driven development" is a real thing. I can testify to that :/
Another problem is that initially it's typically the juniors starting the project, while after a while as the company can justify the costs more senior devs takes over. This is purely logically 100% madness from a code quality perspective, since it's reverses the way things SHOULD be - Which is that the seniors starts the project, and the junior takes over afterwards ...
Aug 05, 2021 · Bob Markowitz
Amazing arguments, if you follow my profile, you'll quickly realise we simply HAVE to talk ^_^
Aug 02, 2021 · Thomas Hansen
Great points, but the idea wasn't as much to use Micro Service architecture as using pre-existing micro services, sometimes commercial modules. If you don't have to maintain the code, technical debt isn't even possible in theory. Technical debt originates from code. No Code, No Problem ;)
Jul 21, 2021 · Thomas Hansen
Really, Clouds are "fancy web servers" at the end of the day, ignoring some of their scaling features. However, both Jelastic and DigitalOcean allows you to scale up on demand, making much of the scalability issue also a mute point. There are always free alternatives, for instance MongoDB or CouchBase instead of Dynamo and Cosmos, etc, etc, etc. If you exclusively choose the open path, migrating is quite easy :)
I don't agree you "have to accept lockins" ...
Clouds are the "new ActiveX"` of the 21st Century ...
Jul 14, 2021 · Thomas Hansen
Which was exactly my point ...
Jul 10, 2021 · Blake Ethridge
Ohh, I just realised I was supposed to shout out about other writers here ... :/
I can't pick one, so just make sure you read DZone every day, and like articles and comment, such that you encourage everybody to write more ^_^
Jul 09, 2021 · Blake Ethridge
Jo guys and gals - I write about lockins in an attempt to try to make sure you avoid them - I'm almost at 1 million page views so far, so I would appreciate some shares and likes peeples ^_^
Jun 25, 2021 · Thomas Hansen
I'm pretty sure DZone has enough servers to hold off a DOS attack ... ;)
It's arguably the largest software development website on the planet ...
Jun 25, 2021 · Thomas Hansen
Interesting, but try posting something critical about your government of choice. You've got a "narrow interest field", which isn't really that interesting for "the masses". If you had a "wider" field of interests, such as (neutral) research related to Korona, or a debate about Direct democracy versus representative democracy, etc - My guess is you'd find it difficult to get your words out - Not because people don't agree with you, or at least want to listen to you - But rather because of that the "existing power structures" don't want you to speak your mind in regards to these things ...
I still find it cute that such places to some extent still exists. I guess the lesson learned is that "life will find a way", which comforts me to be frank ... ^_^
Jun 25, 2021 · Thomas Hansen
Thank you for having courage to speak the Truth <3
Jun 25, 2021 · Thomas Hansen
If you've got .Net 5 CLI and Angular, you can also run it straight from its zip file. Slightly more cumbersome, but I can do it on a virgin machine in 5 minutes myself ...
Jun 24, 2021 · Thomas Hansen
Did you see the video ...? ^_^
Jun 24, 2021 · Thomas Hansen
Well, you certainly won't find it at Reddit ...
Jun 23, 2021 · Thomas Hansen
You can download or clone the project directly from its GitHub repository, and natively compile it, assuming you've got .Net 5 CLI, MySQL/MS SQL, etc - So it does have a distribution that's significantly closer to "the iron" than Docker. Docker is just a convenience distribution currently for developers to play around with it, in addition to being a potential long term VPS delivery mechanism for VPS providers, etc ...
Not sure which other distribution mechanisms I could really apply to it? Suggestions ...?
I agree with your Jubilees argument, insanely too for the record. Not sure I agree that Ted was "all there" though, even though he raised (some few) "valid concerns", if I am to be "nice" to him. However, with an IQ of 190+ something, I'm fairly confident he could have chosen alternative paths to influence its future movement, resulting in a more lasting (positive) impact than the "delivery mechanism" he chose, which I personalyl believe is more closely related to the fact that he was incel rather than an "idealist" as he tried to project himself as. Although Ted's story obviously is a very sad story (MK ULTRA stuff at Harvard, etc), I don't want to give him anymore credit than I think he deserves, which is (almost) zero in my book ...
As to choosing less Biblical references in regards to names of modules in the future; Noted! However, for the 3 ones currently in place, I don't think I'll change their names, to avoid confusion. BabelFish is anyway a funny story for those having read "The Guide" ... :)
Anyways, there's a lot of smart guys on the planet, you (obviously) being one of them. If we all do what we used to do in the mid 90s (pull slightly more than our part), without fear of repercussions, which is (kind of) the idea in this article - I'm fairly confident in that we can reach Ted's goal, without blowing stuff up - Which kind of was my argument here ... ;)
Jun 23, 2021 · Thomas Hansen
Which is exactly why I wanted to use it. The way I see it Silicon Valley is the tower of Babylon, and by distributing it evenly across the world, giving others an opportunity to reproduce its value proposition locally, it's being "scattered around the world", kind of like the same way the Biblical story tells us the story of Babylon.
In a way what is being attempted in Silicon Valley is to try to become "gods", or omniscient, especially once you add surveillance to the mix, such as Snowden revealed. Personally I really think that is a sin. So for me Babylon as an analogy is a very good way to describe what Silicon Valley actually is ...
Jun 22, 2021 · Thomas Hansen
Sorry man, I couldn't quite help myself - Hopefully you'll take it as a sport :)
https://dzone.com/articles/turning-cqrs-into-a-checkbox
Jun 22, 2021 · Thomas Hansen
Thank you Joseph :)
Jun 22, 2021 · Thomas Hansen
Kind of, until you understand the EEE strategy ...
However, if we're to replace lockin with open tech, we need to deliver what people want. As to .Net, this thing is .Net 5, which is 100% Open Sauce from the bottom and all the way up. MS SQL is in such a regard a better argument, but I provide 100% transparent "migration" (more or less) from MS SQL to MySQL. In fact, these are "radio button select widgets" during the CRUDify process ...
But I see your point, but my point is to create a "bridge" from lockin to open space tech - At which point I have to provide solutions to where people are today - Which is in the lockin space unfortunately ...
Good question though, but 50% of it is "out of date" (the .Net 5 parts) ...
Jun 20, 2021 · Thomas Hansen
Awesome Amber. There are millions of Python developers on the planet. These too will need open tools, allowing them to migrate their software if needed. It's not about specific frameworks, libraries, or languages - It's a mind set first and foremost. See my comment to Rohit above.
The task at hand is to provide open alternatives for all "convenient" lockin technology. Parts of that task needs Python developers, parts of it needs Java developers, parts of it needs Angular and .Net developers. If we all do our part here, the open tech space may very well become even more convenient than the lockin tech space :)
Jun 20, 2021 · Thomas Hansen
Great Rohit, there is a lot more work to be done. Some things are also simply education, such as teaching people that choosing "too convenient tools" has a cost later down the road. For instance, regardless of what people think about Parler, it's important we never allow anybody to forget the lesson it taught us, the next victim might be anyone of us, or our employer - What do we do then? Teach people to avoid using lockin tech. Build instead on top of tech you can move around. Use such tech yourself, and evangelise it. One doesn't have to be an expert programmer to do the right thing :)
Jun 19, 2021 · Thomas Hansen
It's not a threat to them. Try posting something that is critical towards the official agenda related to Covid19, and you'll very clearly and rapidly understand "who controls the world" my friend ... :/
Jun 09, 2021 · Thomas Hansen
Interesting ...
I've just discovered "traits" in Scala myself, which are more functional in nature ...
However, with Scala I suspect I'd miss interfaces ... :/
Jun 09, 2021 · Thomas Hansen
I agree, parts of OO I love, and I think you adequately summed up which parts more or less ...
Jun 09, 2021 · Thomas Hansen
Of course you're right, but when OOP was "sold" to us in the 1980s, the selling point was inheritance and polymorphism. Then we had to spend the next 40 years telling developers to avoid inheritance, and prefer composition. Your example with GWT below is just one example of how the idea as implemented currently is fundamentally broken. It was a bad idea, always was, and always will be.
Ignoring interfaces, which we (ofc) should use to separate implementation and contracts, 90% of OO is stuff you should try as hard to avoid as you possibly can, almost regardless of the situation. I think I can count on one hand how many times I've used polymorphism the last year and it actually made sense for instance ...
The fact that 19 out of the original GoF Design Patterns makes no sense in for instance LISP is just one way of seeing this. In fact, when (any) programming language needs "design patterns", it's often to bypass fundamental flaws in the language itself. Your factory example above for instance, could instead be provided as follows using functional constructs ...
run (Func<IRunnable> creator)
At which point you've eliminated (at least) one type dependency between your constructs (the AbstractRunnableFactoryImpl)
But I suspect we agree for the most parts ...
Jun 09, 2021 · Thomas Hansen
LSP for instance, the natural and intuitive way to think about a square is to think of it like a special case of a rectangle. In OO, following SOLID, more specifically the L parts, this is impossible. OO bends and twists your brain in ways that are not natural in regards to how it really is ...
"Verbs" are a much more natural way to think about (whatever) problem you're trying to solve than "classes". Verbs are more naturally applied in FP, and also computing in general, since computers are first and foremost the "modelling of processes". Methods on the other hand is associated with a class. For instance "run" is a verb that applies to both dogs, humanoids and cats. So we might be tempted to associate it with our "mammal" class, except for those darn dolphins ...
If you were to model a class hierarchy mirroring zoology, where would you put "run"? Or for that matter, any other method ...?
I could probably come up with dozens of more examples, but I think you get the point. I could go on for hours, but I suspect you get the point ...
Thinking in terms of classes artificially divides things into categories that are rarely if ever relevant to the problem we're really trying to solve.
Jun 09, 2021 · Thomas Hansen
It's impossible to model anything resembling the problem you're trying to solve, because OO requires you to think in black and white. Nothing is black and white ...
Jun 09, 2021 · Thomas Hansen
FYI, OO segregates your brain into absolutes, and categories, that rarely if ever have any truly existing basis in the "real world" ...
In a way, it's the equivalent of "systemic prejudice for system developers" ...
Hence, if you need one word, use "tech-prejudice" ^_^
Jun 09, 2021 · Thomas Hansen
Well, ish kind of - Check out the babel link above to see how it combines CRUD with other BL aspects, such as SignalR, Web Sockets, etc ...
Your database cannot do that, but I see your point, and I don't disagree ...
Jun 09, 2021 · Thomas Hansen
Hehe, you are right, but everything has its place (somewhere) - As to CRUD, you might want to checkout this baby of mine - https://polterguy.github.io/
(My project)
When that is said, I rarely actually use it myself the way it was intended to be used, something you can see here, where I arguably apply CQRS, in addition to (some) CRUD ofc - https://github.com/polterguy/babel
I guess my take on it is as follows; "If all you do is CRUD, why not let the computer create it anyway, at least that way you can throw it away, without loosing more than 1 second of work" ... ;)
Jun 09, 2021 · Thomas Hansen
"Any fool with a keyboard can make something work, but design shines long term"
I've been known to say this as follows; "If you're a developer, your primary task is to create something other people can understand. Whether or not it works, is of secondary importance" ...
"You will not see that it costs 3x-4x as much to develop new features because there is just no reference for comparison"
I am a fanatic believer in "the big rewrite" so these are words I can agree with ...!!
Personally, I'll dumb down things to the extreme to such an extent that anybody having read books about DDD and such will scream out BLASPHEMY!
Check out the comments I got on this bugger for references :D
https://dzone.com/articles/teach-yourself-ddd-in-5-minutes
Jun 09, 2021 · Thomas Hansen
I can tell you what reuse in OO is; "You want the banana, and you get a gorilla, holding a banana, in the rain forrest" ... ;)
I once wrote an article here called; "This is your brain on OO" where I destroyed the idea - So I don't disagree with you ...
See my (other) comment to Robert for more details ...
Jun 09, 2021 · Thomas Hansen
"you producing maintainable code to be *despite* trying to use SOLID, not because of it"
Hehehe :D
Notice how I don't disagree with you here ... ;)
I work (mostly) in functional programming languages, where it makes little sense. However, when I work with OO, I tend to try to follow it as much as I can where it makes sense. Read the article I am linking to, to get a slightly more "nuanced perspective" of what my perspective in regards to SOLID is ...
"Also, ironically, if you as my manager would throw SOLID at me, I would consider that micro-management"
Interesting edge :)
I'd probably throw SOLID at you, yes, probably even during a job interview, but my edge would probably be "Tell me 5 bad things about SOLID" ...
But SOLID is like the original 23 GoF design patterns, it makes sense within a the context it was created within. I once saw a guy proving how 19 of the original 23 design patterns were completely useless in LISP, because LISP had mechanisms rendering them completely obsolete - Which is kind of weird, considering LISP is 50 years older than the GoF book ... :/
Interesting comment. Personally I don't believe in "silver bullets" or "holy books" the way others do. I'll read them every now and then, to make sure I don't miss out on something - But typically I'll end up finding flaws in them also, more often than not. There is a balance in there somewhere ...
May 31, 2021 · Thomas Hansen
98% of React's beauty, if you agree it is beauty, is composition, class hierarchies, and function design - I should know, I have built half a dozen frameworks and "low level libraries" down these allies. As to "logical/mathematical process", I'd argue respectfully that you couldn't be further away from the target. 99% of coding is art, as in making things beautiful, such that reusability and understanding of the code later down the road comes natural.
If you'd like to see an example of the latter, you might be interested in my own baby ==> https://polterguy.github.io/
Which I believe exemplifies all of the above ...
May 25, 2021 · Thomas Hansen
My point exactly ... ;)
May 22, 2021 · Thomas Hansen
Hehehe :D
Did you ever need to remember how to implement (any) sorting algorithm later ...?
May 21, 2021 · Thomas Hansen
I edited the caching question
May 20, 2021 · Thomas Hansen
I agree with the caching parts of your comment, and I should probably have further abstracted it, and for instance "explain the different ways to cache in an HTTP Web API" for instance, at which point the answer should contain some mention related to server side caching, and one mention in regards to client side caching, being able to explain pros ond cons with both methods. With bonus points if the candidate speaks about Cache-Control and If-Modified-Since, in addition to (.Net) IMemoryCache, Redis, etc ...
May 20, 2021 · Thomas Hansen
I tried using "candidate" instead of "he" in some places, but after a while it became simply too long sentences, but I do see your point - I'll become better :)
May 19, 2021 · Thomas Hansen
Thx Jeff, I've had it "in my mind" for years actually, but you don't want to stir the pot too much, until you can no longer avoid to do it ... ;)
May 18, 2021 · Thomas Hansen
That is probably a wise refusal ...
May 11, 2021 · Lauren Forbes
"over at ," - Typo, somewhere around paragraph 2 :)
Apr 30, 2021 · Thomas Hansen
Great insight man :)
Apr 15, 2021 · Thomas Hansen
Haha, no comment ... ;)
Apr 05, 2021 · Thomas Hansen
Sorry, I published the article before the YouTube video was finished processing. If it's got bad quality, just come back 15 minutes from now or something to watch it again ... :/
Mar 11, 2021 · Melissa Habit
Psst, I try ^_^
Mar 03, 2021 · Melissa Habit
Maybe, loved child has many names. I've only heard about it as materialised path though ...
Mar 02, 2021 · Abhishek Gupta
Here's one of the tradeoffs described fairly well - https://dzone.com/articles/database-synchronisation-techniques-the-good-the-b
Effectively making it 10 times more difficult to avoid race conditions and synchronising updates to the database ... :/
Microsoft, are you listening ...? ;)
Mar 02, 2021 · Michael_Gates
Love it :)
I play 5 instruments myself, and I tend to explain it such that it "keeps my brain balanced", being a right hemisphere activity, allowing me to wind down after long periods of coding ...
Feb 28, 2021 · Justin Albano
Decentralisation is the only solution, combined with fragmentation of cloud vendors. Supporting (small) cloud vendors, in non-US parts of the world, combined with making sure your software runs on stuff such as Raspberry PIs, etc, for "guerrilla" speech ... :/
I have been thinking a *lot* about this, for almost a decade, ever since I started publicly supporting Assange and WikiLeaks, and was more or less crucified for my opinions ...
Feb 22, 2021 · Thomas Hansen
Not very convincing, wax harder ... ;)
Dec 04, 2020 · Thomas Hansen
Yes exactly! And the result is that you end up with temporary projection code, in both your database, and your business logic code, resulting in spaghetti solutions after a while - Especially since phone numbers are merely one example. And in a mature application, you typically end up with hundreds of such changes after a while.
But yes, everything is solvable - Though some solutions tends to create more problems than the number of problems they solve ;)
Oct 28, 2020 · Thomas Hansen
Once a coder, always a coder my friend ... ;)
Oct 27, 2020 · Thomas Hansen
This is the same persistence mechanism used in for instance BCrypt for .Net, that is using individual salts + blowfish. The idea is that you don't need to know the password, you only need to have an algorithm that once applied to the salt+hash in one side of the equal sign, and a password on the other side, produces a yes/no type of response, indicating if it's a match or not.
However, hashing the same string twice using BCrypt (and PBKDF2) produces two different resulting hash values. I need to be able to reproduce the exact same hash value, given the same input - Since it's used as a symmetric key to encrypt/decrypt the AES encrypted package. Hence, for this particular use case, it's useless. At best, the hashing algo itself could in theory be used without a salt. But that wouldn't give any benefits, since a rainbow dictionary attack could still be applied, only creating the dictionary would require more time, due to the slow hashing.
But once you have the dictionary for all permutations of possible password, given a specific workload, you could reuse it on everything.
I need the exact same hash produced given the same input. Implying PBKDF2 would be useless for this scenario ... :/
Oct 25, 2020 · Thomas Hansen
I started looking into PBKDF2, and it seems to be requiring a salt, and hence works similarly to BlowFish and other "password generator algorithms", which seems to make it useless for generating a 32 bytes long key from a string for my AES purposes, since the whole idea is that the AES algorithm requires the exact same array of bytes during decryption as encryption. Hence, I cannot use something that could generate a different set of bytes the next time it's run.
The way I see it, PBKDF2 is perfect for password storing in a database, for instance for your users table and similar things, where you don't need the exact same password being generated twice, if you provide a random salt. Notice, I am using BlowFish for storing my passwords already for users authentication mechanisms and such - However, I'm not sure how it could help to generate a key from a password for AES, since I would need the exact same set of bytes every time I invoke it, which implies I'd have to use a static salt (at least), kind of defeating its purpose ...?
I see the point with slow hashing and key stretching for the record, but I'll need the exact same set of bytes on consecutive runs here, which PKBDF2 cannot, or at least should not generate ...
Am I missing something here ...?
Oct 24, 2020 · Thomas Hansen
Thx, I found lots of hits :)
Oct 24, 2020 · Thomas Hansen
I have been thinking about what you wrote, and although the password feature will probably in practice be rarely used, I still should have some "slow hashing algo" to generate a 256 bit key from the specified password. Do you have anything to suggest for .Net Core ...?
Oct 24, 2020 · Thomas Hansen
Interesting Arnaud, and thank you for the info :)
Though, when I use AES internally, to encrypt/sign/and transfer packages, I use SecureRandom to generate a key. The string/password feature is only intended as a "convenience method", for users wanting to use a passphrase to symmetrically encrypt something. I never use it internally in the other methods. I will still investigate your alternatives to make sure I'm doing this as secure as possible.
Please feel free to look through its code for more "holes" if you wish :)
Oct 11, 2020 · Thomas Hansen
You create an overload accepting a dictionary - You can read the continuation, leading you to a wrapper class I created myself here. Here's its interface, giving you an idea of how to wire things together.
Whether or not you want the JWT token overload or not, is a matter of taste I guess. It's just a convenience method, created because it's the thing I care the most about myself, which of course will add default headers being application/json for content negotiation.
Oct 10, 2020 · Thomas Hansen
You're right, I'll edit it, and remove it :/
Oct 10, 2020 · Thomas Hansen
Half of these answers are down the alley of 'never'. Most of those answering never, give sound arguments, good reasoning, and seems to be intelligent people ...
As for me, I've worked with it for 2 years myself, and I passionately hate it, the same way I started hating Logic Apps after a couple of months of being exposed to them ...
Oct 10, 2020 · Thomas Hansen
Reflection, XML, GUI blocks to design conditions/variables/flows - Need I continue. I might be the first guy to state it as bluntly as I did, but I'm not the first guy to propose it's garbage. Google MWF and see what others are saying about it mate ... :/
Oct 10, 2020 · Thomas Hansen
Psst, check this out ^_^
Oct 10, 2020 · Thomas Hansen
You're right that the number is probably much larger than 50%. I just wanted to give a conservative estimate. For instance, HTTP is at its very core stateless, it's the way it was designed. OO is by its very nature arguably a state machine. Hence, in the entirety of the HTTP space, OO becomes like using chewing gum to fix an airplane - It might work, but it's not the right tool.
Each HTTP endpoint is at its core a "function". Starting out your function invocations with object instantiations, is simply wrong ...
Oct 09, 2020 · Thomas Hansen
Hehe, I wish I understood half of what you were talking about. Being an honest guy though, I'll avoid the temptation of pretending - Though in "the real world", 50% of the time, having a simple function, seems to create much more easily maintained code, than having a class, or 100+ classes for that matter. For instance, what's the cost of instantiating a class, and how much garbage field/property decoration will it perform? I can give you dozens of examples, but I assume it would be superflous at this point ...
Oct 09, 2020 · Thomas Hansen
> For example a financial application
FinTech happens to be my industry, and I can give you dozens of examples where compiled business logic is in fact pure madness, and arguably the equivalent of "computing psychosis". As an example, imagine a ForEx trader. These types of companies are normally regulated in half a dozen jurisdictions; CySec, FCA, Bahamas, Cayman Islands, ASIC, etc. Each jurisdiction has its own separate laws, in regards to especially KYC processes, margins, etc - Which makes these apps arguably end up as more or less completely "different applications".
However, each "installation" needs the devs to follow the regulations, meticulously, as if it was religious dogma. On top of this, each jurisdiction often seems to apply new regulations, and changing laws every 6 months - In addition to that business even more frequently comes with change requirements such as for instance; "We need to support MLM Introducing Brokers", etc. Not to mention the fact that these systems are often created by some subsidiary, which is serving up to 6-12 different daughter companies, owned by the umbrella company - Often times, each with its own separate marketing department, business departments, etc - Assuming the same app can serve all of these buggers, for cost reasons (duh!)
The whole thing becomes a big ball of mud if you try to "compile it". If you dynamically orchestrate it though, loosely coupled, such that each jurisdiction has its own separate set of "script files", the problem becomes quite maintainable in fact.
Historically, in the .Net space, this problem have been solved using different Microsoft Workflow Foundation implementation files, which of course is a hot smoking pile of garbage, even ignoring the fact that it can't even run on the .Net Core stack - Probably because Microsoft realised the same as I did, which is that MWF is garbage - Hence, you arguably have no solution today, unless (of course) you're willing to look in the proprietary segment of .Net Core.
Hence, FinTech is the primary example of that compiled BL is a psychosis waiting to unfold - Which I'd be the firs guy to testify towards, having exclusively worked in FinTech for a lot of years, in multiple different companies ...
Oct 09, 2020 · Thomas Hansen
MWF ==> Hot smoking pile of garbage. If you're looking for an alternative btw ...
https://polterguy.github.io/tutorials/task-scheduler/
Oct 09, 2020 · Thomas Hansen
Amen :/
BTW, Serverless Architecture is a hot smoking pile of garbage piece of crapware. It's the new ActiveX of the dev space ... :/
Oct 09, 2020 · Thomas Hansen
> Yes, it is a piece of crap, I admit. And then trying to make it better with HttpClientFactory
Psst, if they had used a functional language ... ;)
For God's sake, implementing input/output in a functional language, is a no-brainer - Something I arguably proved myself.
Oct 09, 2020 · Thomas Hansen
> I feel like all of ASP.NET Core is a huge improvement over everything MS has done to date for the web. Way better than WebForms and MVC
I agree
> I think they've generally done a great job and missed the mark on a few
Agree
> But why would you do that if expressing it as a function makes so much more sense? I don't understand your point
The point is that unless you can easily explain something, without starting to wave your arms around, and spend 15 analogies, and 50 days, before you come to its core - It's probably not worth explaining, and it's probably wrong in the first place. Seriously, input/output - That's what created the computing industry. Everything else is "dogmatic superstition" ... :/
> because a tool doesn't work in a particular situation doesn't make it totally useless
I don't honestly believe what I'm writing, I just want to create a bit of cognitive dissonance, to make room for more tools ;)
And I'm tired of noobs believing in that "tool xyz is the best thing since sliced bread", and then you try to teach them about its inferiority, and they go like "you suck". I figured it was payback time :D
Oct 09, 2020 · Thomas Hansen
Psst, believe me - I know OOP :)
Oct 09, 2020 · Thomas Hansen
> I also wouldn't be so naive as to blame problems I have with those on OOP either
Actually, I disagree here. For instance, HttpClient implements IDisposable, which you're never supposed to invoke - Right? This again is a violation of LSP, Liskov Substitution Principle. In addition, it mutates, due to having all those "Default properties", allowing you to set default values, used if the HttpRequest doesn't explicitly override the default HTTP headers, etc, etc, etc. HttpClient is a primary example of the header of the article, since when not even Microsoft's best developers can get this right, who're we to think we can get it right? All of the above problems are related to complexity relating to OOP. FYI - HttpClient is the lousiest piece of crap class ever created and architected, that ever came out of Redmond, and it was created by some of the smartest OOP guys on the planet - Its interface and implementation is in fact the best argument for my case ... ;)
> Yet, those who really know it can express some pretty powerful things beautifully, but certainly it is not just f(x)
e=mc2 has implications that are far more complex than the original equation, but the fact that the equation can be explained with 3 components, is what makes it the truth, and beautiful, and easily understood. Sure, functional programming languages are more than just f(x) - But try to devise a similar equation around OOP, and see where that brings you ... ;)
> Again, your article screams more of not wanting to actually learn your craft and have tons of abstractions provided for you than anything
Believe me, I know my craft ... ;)
I could show you half a dozen of (really advanced) C# Architecture articles I wrote for Microsoft, which are still publicly available on Microsoft's website. I could show you a GUI library written in C++, with multiple inheritance, and some really interesting template class hierarchy, inheriting from the template class, using partial template specialisations, etc. I could show you how I started using C# back in the times of BETA1, when their ASP.NET WebForms pages used to be ending with ".asp+" - But that would only make me come across as a dick, so I'll refrain from that. After all, I'd much rather want to discuss the topic, than to compare the sizes of our "xxx" ...
But I can tell you this much. It takes somebody really knowing their craft, to objectively scrutinise it, and criticise it. If I didn't know OOP, I would probably not raise my voice in regards to it ...
> And then I'd say to the builder, I guess we don't need you any more. I can figure out the door
You summed it up my friend :)
Oct 09, 2020 · Thomas Hansen
> This is the article was written in the worst way possible
Psychology have scientifically researched the reasons for why you feel the way you do decades ago. And it's called "cognitive dissonance". It results in a feeling of discomfort, when the brain is confronted with something it feels unpleasant, due to that it contradicts existing knowledge. For the record, I do agree that it could have been written better. The reasons for that, I explain in another comment further up. However, even though I only spent 10 minutes writing it, I spent almost 4 decades researching the ideas, culminating in my conclusion. The conclusion, which is the important parts, is solid as rock!
A famous artist once spent 4 minutes on a painting, and was asked "Why did you ask 5 million dollars for a painting you spent only 4 minutes creating". The artist answered; "I spent 40 years and 4 minutes". This "painting" is one of those places ...
Oct 09, 2020 · Thomas Hansen
> In my experience, automagical things are recipes for serious disaster because as soon as you step one foot out of the blessed boundary, you go from 2 lines to 2000 just to do what you want
This part dictates you can never use HttpClient, Database connections, garbage collectors, or Logging libraries - Because they might result in that you at some point in the future experience bugs, due to leaking abstractions. You don't even believe this yourself. If you did, you'd be coding in assembly, never using libraries, and you'd have to create your own network drivers, file drivers, garbage collector, etc ...
> Bad OOP or bad functional or bad any other paradigm usually roots from bad design by the programmer
Great designs, dictates great code and modularity. To learn OOP requires arguably a decade worth of studying. Learning a functional programming language requires understanding the following.
Needless to say, but the equivalent "equation" explaining OOP, requires books, if not libraries of written text. e=mc2 is beautiful because it's simple, if it had ben e=gf4x/78^24 - Einstein would still be working as a patent clerk ...
Oct 08, 2020 · Thomas Hansen
Parts of your comment is intelligent, and the reasons are most of us write in our spare time, and we don't get paid to write. As to the arguments quality, I'd like to emphasise that if they were so bad, you'd be easily able to counter them. The arguments are solid as gold ^_^
Prove me wrong ... ;)
Oct 08, 2020 · Thomas Hansen
BTW, I think this one is better, though arguably rewritten from Erik Naggum, a Norwegian brilliant LISP programmer, who passed away almost a decade ago, way too early ... :/
"The unexperienced programmer had a problem, so he said "I'll just use OOP". The unexperienced programmer now had TWO problems"
Oct 08, 2020 · Thomas Hansen
Hehe, go for it ^_^
Thank you :)
Oct 08, 2020 · Thomas Hansen
> even if "successful" by some metrics
McDonalds is also successful, so are cigarettes, heroin, and nuclear rockets. It doesn't mean it's healthy, productive, or a sane pursuit ;)
> Programming is a profession, you'll have to learn things
I agree, but e=mc2 is beautiful, not because of its complexity, but because of its simplicity, and how this simple equation explains the most complex processes in our universe. If the truth had been e=mc2xhg4^78/24 - Einstein would have been an unknown patent clerk, and we wouldn't have had satellites, the internet, GPS, or moon rocks to play with ... ;)
But yes, I will walk through *everything* our industry takes for granted as "best practices", and utterly do my best at completely ravaging and pillaging the thing, to deconstruct assumptions, in an attempt at trying to make people think - Which this article is one example of. Next on my "hit list" are NoSQL database. Then I'm gonna do Micro Services. Later, I will murder CQRS, etc - And if I still are alive at the end of my series, maybe - Just maybe - I might have created a couple of new ideas in people's minds ^_^
Oct 06, 2020 · Thomas Hansen
Hahaha, TTYL mate ^_^
Oct 06, 2020 · Thomas Hansen
I got an email about a new comment on my article, and I went to check, and it was gone - Weird ;)
Sep 24, 2020 · Hristiyan Pehlivanov
CQRS, and for that matter Micros Services, are the single most abused design pattern and architectural principles, ever created. It sometimes feels that developers are trying to "fill up their CV", and hence overcomplicates things into absurdity, when a good old simple CRUD solution would suffice ...
95% of all apps I've seen that implemented Micro Services, and/or CQRS, only became more complicated, and never needed it in the first place :/
Sep 24, 2020 · Thomas Hansen
Hehe, I rest my case :D
Psst, Magic generates an Angular frontend for you too. Not that I think you care, but others might read these comments ^_^
Sep 24, 2020 · Thomas Hansen
Great work :)
As to if this is an infomercial? Yup! But it also contains valuable general information. Did you checkout Magic BTW?
Sep 18, 2020 · Thomas Hansen
Not sure what environment you're in, Java ...?
But can you apply "inheritdoc" ...?
In .Net such things exists ...
As a general rule, I apply "inheritdoc" for all methods implementing interfaces, etc ...
But yes, some of the things it flags, are arguably a bit stupid'ish ... :/
Sep 15, 2020 · Thomas Hansen
Actually, many organisations, also larger and more mature organisations, have this as a policy. In some organisations your pull requests won't even be accepted if the reviewers find "dirty code" over or beneath your changes - As in code you're not even responsible for yourselves.
I'm not saying you're wrong, I'm just saying there are different approaches to these issues, and it all depends upon which philosophy the company is using to create code ...
I'm an architect myself, handling some 3-4 different projects, with a total number of 10-15 developers and PMs, Scrum masters, etc - And this principle is one of the core code quality processes I am currently implemented - Combined with what I'm to write up about next of course ;)
Sep 03, 2020 · Thomas Hansen
Most of these things would be simple, and probably easily implemented using ReSharper, or something similar, making it impossible to apply semantic changes for its runtime behaviour. Renaming variables from e.g. "clienIdt" to "clientId", etc - Cannot not even in theory apply runtime changes, if it's a variable inside a method, etc ...
Jul 13, 2020 · Thomas Hansen
Go for it :)
May 16, 2020 · Thomas Hansen
Well, you can count the number of cross project references your project has, that would give you one metric. You can count the number of arguments requiring concrete classes instead of interfaces as arguments, that would give you another metric. There are ways to measure the amount of "SOLID" you are implementing, and quantify it, but I agree, it is a blurry topic ... :)
May 16, 2020 · Thomas Hansen
Thank you :)
Measure and check what? Unit tests ...?
I love measuring and static analysis, but I am not sure I understand what you want to measure ... :)
May 09, 2020 · Thomas Hansen
Adding NuGet package "magic.http" should resolve both of these. If not, add Newtonsoft.JSON too :)
"magic.http" is created by me, and technically not licensed as MIT, but I'll probably end up doing it at some point, as I have the time - Feel free to use it under the terms of the MIT license until I do :)
Feb 21, 2020 · Blake Ethridge
@Charles - The article was intended to be easily digestible, with easily remembered punchlines. But I like your suggestions too. Feel free to write your own article, maybe link to this one ...?
@Bas - My "favourite" is "we are too busy". There's a popular meme with some stone age men dragging a cart with square wheels, while saying "we don't have time to change to round wheel, we're too busy". This one perfectly describes the problem it I think :)
Feb 21, 2020 · Thomas Hansen
Feb 21, 2020 · Thomas Hansen
@Keith - Interesting what you say. However, when you say "getting the parameters right" - I have to admit I'm getting Elliptic Curve flashbacks here. Who's "selling" this thing ...?
Feb 18, 2020 · Daniel Stori
Hahahahaha :D
Actually, the English pronunciation of the "bash" literally translates into English as "poop" ... :)
Feb 17, 2020 · Thomas Jardinet
Interesting idea, and I can completely agree with the basic assumption of your thoughts here. Definitely IT and HR have overlapping goals. Not sure if it's possible to implement practically though ...
... but interesting idea :)
Feb 12, 2020 · Blake Ethridge
@Tugce - Not sure about the others, but I've got 37 years of experience creating software. In between us, I'm pretty sure we're not too far away from 100 years of combined experience - So I'd say confidently that these are things you can be pretty sure about works yes ... ;)
Feb 12, 2020 · Thomas Hansen
Feb 12, 2020 · Thomas Hansen
@M K
The underlying principle of the article is to teach developers about the importance of hashing passwords, the importance of using individual salts, some of the reasons for doing it (Rainbow Dictionary Attacks), and provide the user with an easy to use library to apply these principles into their own code.
Which "fishing" algorithm to use in such a regard, becomes less interesting, and the header of the article hence an exaggeration, not to be taken literally - However, thank you for providing the reader with alternatives, some would imply are better.
Feb 11, 2020 · Blake Ethridge
Feb 03, 2020 · Thomas Hansen
Since the reply parts of the comment system here doesn't seem to work Ravee, I wanted to post this here to make sure you hopefully see it.
https://www.youtube.com/watch?v=8xO9H-2Fejc
So my answer is "Yes, if you only consider the backend parts of Magic" ... :)
Jan 30, 2020 · Thomas Hansen
Jan 23, 2020 · Thomas Hansen
Dec 28, 2019 · Thomas Hansen
Dec 28, 2019 · Thomas Hansen
Nov 07, 2019 · Thomas Hansen
Some of my paragraphs were slightly messed up, and are not phrased the way they are supposed to be phrased. I know CRUD is not related to neither SQL nor HTTP, but both HTTP and SQL is definitely related to CRUD. In fact, both SQL and HTTP is for the most parts only CRUD. If you don't agree, I do give lessons in the subject ;)
https://msdn.microsoft.com/magazine/mt833461
SQL and HTTP (REST) are arguably specialized implementations of CRUD in fact.
As to Django, and/or Magic, I can pretty much guarantee you that you'll end up more productive than you would be hand rolling the same.
https://www.youtube.com/watch?v=B8DVg_nqC_g
As to Entity Framework. EF is nice, even though probably some 2-3 times slower than Magic. But it does not take care of authentication, authorization, HTTP caching, logging, or wrapping your classes in HTTP endpoints for that matter - In addition to that it's probably some 2-5 times slower than Magic, even though I don't have data to backup this claim at the moment.
The last time I checked, EF does neither have a dynamic rule based engine, and is not Turing Complete - Magic is all of these, and more.
But if you adore EF, there is nothing preventing you from using it (in Magic).
https://www.youtube.com/watch?v=VwQGK4RD1rI
BTW, Magic is (at least) 2.5 times fasther than Python, and hence Django - Probably much more, in fact probably up to one order of magnitude ...
https://gaiasoul.com/2019/11/02/magic-2-5x-faster-than-pythons-django-and-5-5x-faster-than-phps-laravel/
Nov 06, 2019 · Thomas Hansen
Of course. In fact, I've got a Raspberry Pi at home - I'll probably end up deploying it there, and writing something about it. It'll have Ubuntu though, so the process will be the eaxct same :)
Psst, I'm working with a scheduler. With the DZone moderator's grace, one of my future articles will probably be named "Schedule your C# method to execute next Thursday" ;)
May 15, 2019 · Thomas Hansen
For those interested, there's a slightly improved version of this class over here, since the class was improved upon after the article was published.
github.com/polterguy/magic/blob/master/modules/magic.http/magic.http.services/HttpClient.cs
If you'd like, you can simply remove the interface implementation, change the class' namespace, and make all public methods static/non-virtual, since there's no "state" in the class, beyond the static state that HttpClient from .Net keeps around ...
Apr 21, 2019 · Thomas Hansen
Does humor belong in Software Development?
Apr 07, 2019 · Thomas Hansen
A lot of commenters here have been saying that this is only for creating CRUD apps. I don't want to argue with them, since it's impossible to argue with somebody who have already made up their mind about something, for whatever reasons they have for having done that. However, in case you actually believe them, I just created the following video to prove their arguments wrong ...
https://www.youtube.com/watch?v=Xn459G1WaXc
Apr 06, 2019 · Thomas Hansen
"The theory of relativity tells us that there is always somebody out there bigger than you. If you bully those smaller than you, those who are bigger than you will bully you" - At which point I have taught a 5 year old child everything he or she needs to know about the Universe, Life and Everything ...
Paradoxically, for reasons I cannot entirely understand myself, this seems to be comment number 42 ...
... but maybe I'll understand it as I grow up ...? :D
Apr 06, 2019 · Thomas Hansen
Hahahahaha :D
I'd love to point you in the general direction, but unfortunately I heard it on a BBC documentary, so I can't even link to it :)
Apr 05, 2019 · Thomas Hansen
Believe it or not, but Marx apparently had a wealthy beneficiary, whom he corresponded with, and who sponsored his works. In one of their private letters, Karl literally finishes the letter with that exact sentence ... :D
What can I say? Life imitates art ...? :D
Apr 05, 2019 · Thomas Hansen
Psst, only way I know to play. Either I play well, or I avoid playin' ... ;)
https://www.youtube.com/watch?v=9nAVSaVJZgU
Apr 05, 2019 · Thomas Hansen
Thx :)
Apr 05, 2019 · Thomas Hansen
No! I don't want you to do that. Unfortunately most others would want you to do it, otherwise they won't care. Most people (today) have the attention span of gold fish. Hence, if I can teach them seomthing valuable in 5 minutes, by exaggerating and playing on humour, I'll do it! And I ain't sorry either ... ;)
Apr 05, 2019 · Thomas Hansen
And thank you for doing that. Unfortunately, too many developers today, require information digestible within 5 minutes. I refer to them as the "McDonalds generation of developers". If I can teach them something valuable (DRY for this article), by making an "interesting read", with a "humorous touch", I'll do it. And I ain't sorry either ... ;)
However, when they're done reading my article, they can move onwards to Greg Young's book about DDD, hopefully "filling in the blanks", I couldn't teach them in 5 minutes. Now hopefully with a motivation to dive deeper into the subject ...
(Greg commented further down, so I chose him as an example, but I could also have used Martin Fowler, etc ...)
Apr 05, 2019 · Thomas Hansen
Look at the code. It answers that question ;)
Apr 04, 2019 · Thomas Hansen
I could tell you, but then I'd have to invoice you 100K ;)
Would you prefer Solace, or something else, maybe something custom built ...?
Apr 04, 2019 · Thomas Hansen
I have to admit, it's like almost impossible to not actually going through the process of downloading more RAM at that site, to the point where I even caught myself staring at the Youtube video at the end in fascination and awe for such a beautiful idea :D
Apr 04, 2019 · Thomas Hansen
Hahahaha :D
Looks like my kind of guy yup :D
Apr 04, 2019 · Thomas Hansen
Hahahaha :D
You are right, it does show CRUD and an HTTP REST web API. However, if you look carefully, you'll also notice that I am showing services (separation of business logic and presentation). I am illustrating how it is using Dependency Injection and interfaces to access the business logic layer (service layer). I am also illustrating how I am modeling my database model using classes and relationships between these, never even bothering about the undelaying database implementation at all.
I am also illustrating how the thing is 100% perfectly modularly architected, with zero cross module dependencies. In addition to that everything is super-testable, even the controller endpoints you yourself create, by using SQLite as a "mock database", 100% transparently - Which facilitates for Continous Integration.
All of these are common techniques and ideas when it comes to Domain Driven Design. Of all the ideas presented in Eric Evan's publicly available PDF document about DDD, it implements most of the ideas that are possible to implement in a framework using code ...
... of course the communication parts is difficult to implement for reasons that should be fairly obvious at this point ... ;)
However, even though you are technically right, you're also technically wrong, because you didn't see "in between the CRUD and HTTP REST parts" ...
Apr 03, 2019 · Thomas Hansen
My next article will be named "HOWTO download DDD in 0.1 seconds" :D
Apr 03, 2019 · Thomas Hansen
But I am pretty certain there is some kind of "article gains visibility according to most comments" feature on DZone. So feel free to keep on peeing on my article :D
Apr 03, 2019 · Thomas Hansen
I find it interesting that so many ridicule my article, yet cannot avoid commenting still. Did you have something else to add my friend ...? :D
Psst, you might want to read up on my "Andy Warhol vs. Salvador Dali" comment above ...
Apr 03, 2019 · Thomas Hansen
And CRUD is 5% of what's illustrated in the article, library, and video ...
Apr 03, 2019 · Thomas Hansen
Isn't it fascinating to realise that any noob can simply download a 15KB zip file from the internet, to apply something you've spent a decade, reading 100,000+ pages of documentation to teach yourself ...?
When Andy Warhol painted the picture in the article I use (Mao painting), he used to socialise in the same coffee shop as Salvador Dali. He went casually over to Dali and gave him a painting he (Andy) had created. Dali zipped up his zipper, and peed on Andy's paiting, without even standing up from the chair he was sitting in, and not even looking at Andy's art, whom he thought wasn't art, but rather ridiculous Xerox copy based rubbish. Today Andy's art is worth 10x as much as Dali's art at Christies ...
The article was "clickbait" yes. But not in the way you think it was. I was waiting for somebody to comment like you did, to effectively prove me right ...
The paradox is that by "peeing on my code", you've paradoxically probably made it become 10 times as much worth ... ;)
Apr 03, 2019 · Thomas Hansen
From Evan's book:
1. Institute a process of merging all code and other implementation artifacts frequently, with automated tests to flag fragmentation quickly ==> DONE!
2. Isolate the expression of the domain model and the business logic, and eliminate any dependency on infrastructure, user interface, or even application logic that is not business logic ==> DONE!
3. When a significant process or transformation in the domain is not a natural responsibility of an entity or value object, add an operation to the model as a standalone interface declared as a service ==> DONE!
4. Choose modules that tell the story of the system and contain a cohesive set of concepts ==> DONE!!
Facts are, I could go through every single paragraph in Evan's book, and illustrate exactly where in the code I have implemented every single part of his ideas that are possible to implement, and also how I have provided a framework for others to hook into, to allow for them to continute the process in their own projects.
That you and Francisco chose to focus on the fact of that I (also) happened to have solved the "problems of CRUD", and believe it was the only problem solved, is on your account ...
But you are right, I don't actually "teach DDD". Simply because after starting consuming the ideas manifested into Magic, actually learning it is no longer required, because one ends up with an intuitive approach to it, that allows one to actually do it, without requiring having to "read entire libraries of acronyms" in order to understand it ...
Have a nice day ,)
Apr 03, 2019 · Thomas Hansen
Everything that's not possible to explain to a child, 5 years of age, in less than 5 minutes, is fundamentally broken. We (developers) have many fancy words and acronyms, created to shelter us, in our white ivory towers of dogmatic logos. In the end, they're just that, dogmatic ivory towers of faulty logos ...
If you can't see the connection between this and DDD, you won't ever understand DDD ...
Apr 03, 2019 · Thomas Hansen
Then explain it to me please, preferably without pointing at books (or libraries) - At which point you've explained my whole point ... :D
Apr 03, 2019 · Thomas Hansen
For the record, even though you are 100% correct, DDD is one of those things everybody has heard of, yet few are able to intelligently explain, at least without doing a lot of hand waving, and using a lot of "errh", "duuh", and "kind of" words - Which is a paradox considering one of its primary goals is to simplify "talking about software".
When that's said, "talking about software with 'domain experts'" requires being able to first possess a common language for communicating. The structure of what you call "Magic CRUD", happens to facilitate for this common language "automagically", since it breaks down the different components of a system into understandable constructs, from both the client's perspective, and the developer's perspective.
For example, a client might say "we need an email module". This translates into a folder, with a service, contract, and controller project, inside of the "modules" folder for the developer, which all might start out with the name "magic.email". The client might say "we need to be able to send, read and delete emails". This translates into a "CrudController" and "CrudService" for the developer, overriding the "create" parts, to use an SMTP service, to actually send the email. Etc.
1. Send emails
2. Read emails
3. Poll emails from POP3 account periodically
4. Delete emails, etc ...
All of a sudden the (non-technical) client, and the (uber-technical) software developer, have a common ground, for easily communicate with each other without misunderstanding each other.
Hence, even though I never taught anybody anything about DDD in this article, the "natural side effects" of the article (or the structure the framework provides to be accurate), becomes a process of Domain Driven Design, solving everything required to implement DDD, without anybody even having any ideas what so ever about what DDD actually is ...
Kind of like the way Andy Warhol created "art" using a Xerox copier!
So the joke is still on me ... ;)
Apr 03, 2019 · Thomas Hansen
Of course :D
Apr 03, 2019 · Thomas Hansen
Psst, just realised - If you'd like to see some "extreme measures" of private implementation and encapsulating, you'd like to check out the "signals & slots" implementation in the Magic Core project. It allows two modules to communicate without even having to as much as share an interface or POCO type between them.
It allows you to so stuff such as:
_signaler.Signal("foo.bar", new JObject { /* ... data ... */ });
Then catch this in a completely different module using code such as:
[Slot(Name = "foo.bar")]
class FooBar : ISlot
{
public void Signal(JObject input) { /* ... do stuff with input here ... */}
}
When the "signal" is raised in the first piece of code, all "slots" subscribing to the signal with the "foo.bar" name will be evaluated, getting access to the JObject data passed in by the signaler ...
No shared types, not even a shared POCO type, and no exposed interfaces - Zero dependencies between the signaler and the slot ...
So hence the "signaler" and the "slot" doesn't need to know anything about each other, and can be implemented in two completely differen assemblies, assuming they run in the same AppDomain, without a single reference between them in any ways ...
I'll probably write something up about it later ...
Apr 03, 2019 · Thomas Hansen
It's a painting by Andy Warhol. As I created the YouTube video, I realised I was doing a lot of copy and pasting, and I also realised that even though copy and paste is considered "bad development", I realised this was not "bad development". That painting by Andy Warhol was something he created during his "Xerox copying art period", which made him famous for creating art using a Xerox copier. It was an attempt at being funny on my own account I guess, insinuating "copy and pasting can be art too".
Apr 03, 2019 · Thomas Hansen
You're right. Things are pretty well encapsulated though I'd say.
Sep 18, 2018 · Andre Lee-Moye
I am the author of Lizzie, which I guess to some extent examplifies your article's main thesis here. However, I authored it such that I would have a (safe) language, where I could safely transmit code over the network, to facilitate for passing code over the network for evaluation on another machine. Out of curiousity, does there exist something similar out there? Or have I fallen into the "not invented here syndrome", or does Lizzie have a place in modern computing ...?
Sep 10, 2018 · Thomas Hansen
"If thread 1 acquires a read lock just before thread 2 tries to acquire a write lock, an exception will get thrown"
There might be issues with this proposal, but in the above scenario, thread 2 will simply have to wait until thread 1 has releases its read lock, and no exceptions will be thrown ...
However, your use case provides an excellent example of why I created this class, since the complexity of multi threading is often daunting and difficult to understand, also for experienced developers. By encapsulating the synchronization mechanisms inside a delegate that hides the complexity, mult threading becomes much more easily consumed, also by those who struggle with understanding its nuances ...
Thank you for your interest and your comment :)
Jul 26, 2018 · Thomas Hansen
NP, glad I could help :)
May 30, 2018 · DZone_karap
What did you use to create those diagrams ...?
May 09, 2018 · Duncan Brown
Well, you're right - But OOP has been taught for a very long time that it's a "silver bullet", and it simply isn't. FP is simple superior to OO, and much more closely resembles the way our mind works, and such creates a more correct mapping between our code, and the actual problems we're trying to solve.
PS!
Yup, it's built in OO, but there's not a single shred of OO in Hyperlambda, which most of its code is created in. And in fact, the reason why it was conceived in C# (OO), was to make sure it was as "compatible as possible" with existing toolchains, and libraries ...
Hint, I should know, I created it ...
May 09, 2018 · Duncan Brown
Here's what I am using (almost) exclusively these days. 100% FP, and barely contains typing at all ...
Two simple syntactic elements(colons and double space), and I created this with it.
Sorry, I don't know how to say this without being blunt, so I'll have to be blunt about it - OOP suxx ...
May 09, 2018 · Duncan Brown
There doesn't exist "silver bullets". However, rubber bullets are never the right solution, and such bullets do exist. Say no more ... (OO, coff,coff!)
May 09, 2018 · Duncan Brown
Thank you Sir!!
May 09, 2018 · Duncan Brown
"Since when did just learning design patterns become a negative?"
Since it became a requirement. It is the equivalent of having to read the manual when driving your car, in order to find its breaks ...
Unless the language is "self contained" in its feature set, and requires a decade of "advanced experience", it is not good ...
May 09, 2018 · Duncan Brown
I am sorry for disagreeing with you here, but how much OO experience do you really have? I've got about 20+ years of OO experience, and my conclusion after all those years, is that OO is fundamentally broken!!
To the point where I decided to completely bypass it in this thing.
Classes for one, doe not mimick our reality. Inheritence is close to useless. 23 Design Patterns before you can even refer to yourself as an Architect. Seriously ...?
May 05, 2018 · Thomas Hansen
Thx, God bless you too :)
Psst, you can easily develop on Windows, and deply to Linux, on a completely Open Stack on the server side ...
In fact, I use a Mac myself as my development machine, but I test the source download on windows machines before each releae, and I deply the release (binary build) on a Linux server before I publish them ...
May 05, 2018 · Thomas Hansen
It runs on Mono/Linux/MySQL/Apache
Mono == MIT licensed for the most parts
Linux == GPL (2 I think?)
MySQL == GPL (3 I think, but is also binary compatible with MariaDB if you don't like Oracle)
There's as far as I know not a single closed source of line that is necessary to execute to run Phosphorus Five ...
Open Source "enough" ...? :)
PS!
I run it myself on an old discarded laptop, which I have converted into a "guerilia Linux server", running Ubuntu Server. There's a script ("install.sh") in the download/releases section which automatically configures everything on a Linux Ubuntu server 100% automatically for you ...
This even installs an SSL certificate (for free), sets up Apache, MySQL, etc, etc, etc ...
In fact, a funny fact is that for the most parts, that ".Net Framework" now arguably runs better on Linux than it does on Windows. Although sadly this is a little known fact. Thx to the Mono project of course ...
Thx for the feedback, and for keeping me on my toes, if I should ever stray away from the Open Sauce path ... ;)
Apr 06, 2018 · Duncan Brown
Hehe, reminds me of "the dog ate my homework" :)
Jan 18, 2018 · Tim Spann
It's about time somebody gives software developers a "kick in the nut". Way too much ego, and belief in that we're "Gods" ...!! :P
Thxfor the nice writeup ... :)
Jan 12, 2018 · Thomas Hansen
"And still a security nightmare."
Agree, which is why I didn't build an "ORM" ...
Hint; https://github.com/polterguy/hyper-core#authentication-and-authorisation
And; https://github.com/polterguy/hyper-core#security
Jan 12, 2018 · Thomas Hansen
OK, I see your point.
Yet still, it arguably solves the same problem. Besides, the RPC returns JSON, which (obviously) are JavaScript "objects". And since the acronym of ORM implies "Object Relational (database) Mapping", and JSON definitely are "objects" and MySQL definitely is a "relation database" - It arguably fulfills the criteria, according to its linguistic definition.
So just because you are right, doesn't imply that you're not wrong ... ;)
But of course, according to the traditional interpretation of what "ORM" implies, you *are* correct Sir :)
Psst, https://github.com/polterguy/hyper-core#creating-your-own-extension-methods
Jan 08, 2018 · Thomas Hansen
Do you have a tip for where I can get a (trusted) CDN for version 5.x ...?
Jan 08, 2018 · Thomas Hansen
Hehe, good point :) - I am not really an Angular developer, feel free to create a "patch" (you can edit the files in the "/test/" folder here)
Jan 08, 2018 · Thomas Hansen
For the record, Hyper Core and Hyper IDE has now been released, so the AngularJS template I created for this article, can be reproduced locally, by simply downloading Phosphorus Five. I have also created support for directly linking to code files, such as this example illustrates.
Jan 07, 2018 · Jordan Baker
Nice writeup, but I think you might benefit from "outsourcing" the viewing of the code, to make the article more easily read. Which you could easily accomplish, byt having a web based IDE, where you allow "guest" accounts access to read the code. Check out an example of how to do that here.
Jan 07, 2018 · Thomas Hansen
For those interested, you can check out a tutorial where I make an AngularJS app, with a MySQL backend here - https://gaiasoul.com/2018/01/07/creating-your-first-angularjs-and-mysql-app-video-tutorial/
You can browse the code online here - https://home.gaiasoul.com/hyper-ide?path=/modules/todo/index.html
And test the app here - https://home.gaiasoul.com/modules/todo/index.html
Jan 02, 2018 · Thomas Hansen
Hehe, it actually is a simple menu/navbar thing. Speaking to it is actually optional, since you can also navigate it by simply clicking its items ...
But, point taken ... ;)
PS!
Speech recognition only works in Chrome (for the moment)
Jan 02, 2018 · Thomas Hansen
It starts a voice recognition engine, which you can use to speak natural English to your computer,which again is "translated" into some code snippet, that performs some sort of action :)
In this video, I even create code by using the above construct - https://www.youtube.com/watch?v=I8lhryXiDlk
"My brain may be running slow after my nice, long, Christmas vacation" - Hehe :)
Dec 24, 2017 · Raghuraman Kesavan
ChartJS and Chartist was impressive, especially considering their size. 10KB in total, and simple to use. Thx for the links :)
Dec 21, 2017 · Thomas Hansen
Thx Jordan :)
Nov 08, 2017 · Thomas Hansen
So what's happening with this one, will it be published or not ...? :)
Oct 27, 2017 · N A
Hi, you should check out this thing. Maybe you'll get some ideas :)
https://gaiasoul.com/2017/10/27/watch-me-discuss-my-code-with-my-computer/
Oct 17, 2017 · Thomas Hansen
Good point, and of course relational data schemas are on my TODO ... ;)
Thx though for a good point :)
Aug 25, 2017 · Thomas Hansen
PS, for thos interested, this link leads to my home web server -
Jul 22, 2017 · Grzegorz Ziemoński
Thank you, exactly my point, slightly exaggerated possibly. OOP has enjoyed a God like status for almost 50 years. It's not the only paradigmout there. I guess we largely agree ...
Jul 21, 2017 · Grzegorz Ziemoński
Facts are, we should put posters warning kids about OOP along the highways. They could say stuff like "This is your brain, this is your brain on OOP" ...
Jul 21, 2017 · Grzegorz Ziemoński
I seriously doubt you have more experience in regards to OOP than me. Claiming that I prematurely "jump to conclusions" (your quote) is assumptious at best, ignorant at worst. To believe I am proposing FP too, is also assumptious. OOP has enjoyed a status similar to the Catholic Pope, ever since its mainstream adoption about 10 yearsafter Simula was invented. It has never deserved that position.
I wrote this article, which indirectly sums up my conclusions about OOP - https://msdn.microsoft.com/en-us/magazine/mt795187
My next article was amongst the all time most 5 read articles at MSDN Magazine, so clearly I touched people with it. If you wonder about my "OOP credentials", realize I did more than 10 years ago - http://smartwin.cvs.sourceforge.net/viewvc/smartwin/SmartWin/include/smartwin/widgets/WidgetButton.h?revision=1.29&view=markup
So clearly I "know what I am talking about" when it comes to OOP (the last link demonstrates diamond inheritance, privrat inheritence, and multiple inheritence from template classes)
I also have experience with literally dozens of other OOP languages, such as C#, Java, JavaScript (prototype inheritence), etc - Co clearly I am not "prematurely jumpting to conclusions".
OOP sucks, it's a fact, and I spent 10 years learning OOP, and further 8 more years realising I wasted my years ...
OOP is a problem, this is a solution - https://gaiasoul.com/2017/07/21/hyperlambda-lambda-contracts/
Here's another thing you could only dream of accomplishing in a traditional OOP language - https://gaiasoul.com/2017/07/21/two-really-cool-active-events/
Jul 21, 2017 · Grzegorz Ziemoński
Does this imply me too? See my comment above for clarification ...
Jul 21, 2017 · Grzegorz Ziemoński
OOP sucks, truly! Big time! Its creation emphasized all problems it was intended to solve, by orders of magnitudes. It's a dead end, with no future, forcing us to classify things into absolutes, which does not in any ways mimick the way things are in real life!
Jun 28, 2017 · Grzegorz Ziemoński
Nice one, I did that once too. Memory based, super fast, based upon "lambda expressions", which to some extent resembles XPath :)
Jun 28, 2017 · Thomas Hansen
Thx guys :)
Jun 20, 2017 · Grzegorz Ziemoński
The problem with encapsulation seems to be that almost nothing can be safely created such that it doesn't violate the Liskov substitution principle. Hence creating truly Object Oriented Software, becomes that of trying to constantly sqeeze in a square into a round hole - It simply cannot be done.
There exists one solution to the LSP problem though, which is to realise that all objects are in fact fundamentally the same type.
Zen and the vanishing LSP
Jun 20, 2017 · Sarah Davis
Finally a believer :)
It goes beyond only "websites" though I'd argue, and the same is true for applications, and also web apps. I wrote up (shameless plug) blog about the comparison between P5 and Infragistics, concluding with that the difference in size, could at least in theory, increase load time of a web app, from 1 second to 3 minutes and 40 seconds.
https://gaiasoul.com/2017/06/19/infragistics-ignite-ui-ajax-tree-control-performance-versus-p5/