Live data from Hacker News

The “No Code” Delusion

alexhudson.com

121–130 of 334 posts

Re: The “No Code” Delusion

#121
There's no such thing as "no code". There's just interfaces which are more-or-less capable, and more-or-less intuitive. Any time you define a set of instructions for a computer to execute, you are creating code.

We use Scratch at my Girls Who Code club. It requires students to consider branching paths, and data types, and asynchronous execution. It does not require the students to type, but thank god for that, because they're 9 years old and type at approximately 1 words per minute.

Scratch is still code just like Java, and Lego Mindstorm's EV3, and Automator, and IFTTT. Not all of these systems are Turing complete, and each one contains different restrictions in an attempt to stop users from shooting themselves in the foot: Java doesn't have manual memory management, Automator doesn't have conditionals, and IFTTT is limited to a single trigger and action. But there're still code. Users of these tools need to carefully consider input and edge cases, and test and iterate to see if the code is doing what they intended.

IMO, the primary reason "professional programmers" type their code is because once you know what to type, keyboards are fundamentally faster than mice. That's also why Excel power users frequently rely almost entirely on keyboard shortcuts, and why the command line for an experienced user is often faster than a GUI.

---

Edit: BTW, for the same reason that HTML isn't a programming language, I don't consider most "website builders" to be code, even though I do consider IFTTT to be code.

Code in this context means creating instructions for a computer to follow. Laying out elements on a page (which then adapt to different screen sizes based on predefined behavior) is just that, laying out elements.

I don't know about you, but I can feel myself entering a "coding mindset" when I load up IFTTT—it's simpler than writing Javascript to be sure, but it's the same type of brain muscle, and there's no avoiding it.

Re: The “No Code” Delusion

#122
post #88

Earlier quoted context omitted.

> General purpose programing languages are getting more expressive by the day You know, once upon a time, we understood that declarative approaches to software engineering were superior to imperative approaches, when declarative approaches are feasible. Declarative approaches are much safer and easier to test, at a cost of only being able to express what the tool accepting the declarative approach can understand. Imp…

There are declarative general purpose programing languages. That data you are talking about does need to be debugged, like Helm charts and pipeline definitions. Sure data is better, but config is code, not data.

>but config is code, not data.

Config is both. Config variables are data. The code that accesses and uses those variables is...well...code. they should be kept separate. Like any other code and data. Config isn't a separate special entity, it's just another part of the program. The data part should be represented as such and the code part should be code. Trying to combine them and create a special 'config' language is mistake.

Re: The “No Code” Delusion

#123
post #88

Earlier quoted context omitted.

Thank god trends like Pulumi and the new AWS sdk is emerging. General purpose programing languages are getting more expressive by the day, why do we use data serialization languages instead for configs? it doesn't make any sense. Configuration is code not data.

> General purpose programing languages are getting more expressive by the day You know, once upon a time, we understood that declarative approaches to software engineering were superior to imperative approaches, when declarative approaches are feasible. Declarative approaches are much safer and easier to test, at a cost of only being able to express what the tool accepting the declarative approach can understand. Imp…

I think "declarative" is a bit of a red herring here. Deterministic/reproducible/pure is a more appropriate distinction: configuration languages like JSON/YAML/XML/s-expressions/etc. are trivially deterministic, but not very expressive, leading to boilerplate, repetition, external pre/post-processing scripts, etc.

Allowing computation can alleviate some of those problems, whether it's done "declaratively" (e.g. prolog-like, as in cue) or not (e.g. like idealised algol with memory cells).

The main reason to avoid jumping to something like Python isn't that it's "not declarative"; it's that Python is impure, and hence may give different results on each run (depending on external state, random number generators, etc.). Python can also perform arbitrary external effects, like deleting files, which is another manifestation of impurity that we'd generally like to avoid in config.

tl;dr The problem isn't the style of computation, it's the available primitives. Don't add non-deterministic or externally-visible effects to the language, and it wouldn't really matter to me whether it's "declarative" or not.

Re: The “No Code” Delusion

#124
As someone who has been managing Low Code/No Code on a large scale for a major enterprise from before this became buzzword soup, I can categorically state that the benefits are real.

HN isn't the intended market here, and that disconnect is shown in the currently leading comment thread which is talking about DevOps deployment. DevOps is way beyond what this space currently targets and is working to achieve.

To be crystal clear, Low Code/No Code is not going to replace a company's custom developed application that drives their core business. It isn't even going to replace the need for custom application development throughout an enterprise. This is an augmentative technology stack intended for a different audience.

What it does do is empower non-IT employees to become what the industry likes to call "Citizen Developers". Think more Excel/Access less .

Where this technology currently shines brightest is at the lowest levels of work. Every enterprise has pockets where work is getting done from Excel spreadsheets, Access databases, email chains, SharePoint/Office documents and worse. Essentially work that could be done easier and better with an application, but where the current enterprise cost, developer availability, political/agility issues, or simple knowledge that the problem exists prevents that application from being created.

The best products in this space allow IT to setup a space where non-IT staff can create applications within the confines of the environment to address these problems. For example, a department can go in on their own and replace a shared spreadsheet that is locked all the time from coconcurrent use with something that is truly multi-user. On top of that, they get to enhance their process and improve productivity by having it generate emails to someone when work is needed, or automatically create new tasks when certain statuses are encountered, and other similar things associated with "modern" technology. They do all of this on their own without needing formal IT development resources.

There are obvious benefits to an enterprise here - like replacing multiple unsupported/bespoke solutions with a single known and supported platform - but there are multiple side bonuses as well. For an example of one, the best products in this space have great APIs. The staff making/managing these applications may not even know they exist, and certainly can't write against them, but now IT has a standardized way to get this data somewhere else when needed. Data driven organizations can use this to drive what I call "Small Data", which is applying Big Data practices/analytics to low level work product to improve processes.

The next major development in this space will be low code/no code integrations. When you're talking about these low levels of work, they are generally mid-process actors. Work comes in, gets done, and is handed to the next in line. That data largely gets to these teams from some kind of export process in the upstream system - CSV dump, daily email, etc. - and then needs to get fed back up via a similar or worse method. You can use the aforementioned API to fix this, but that again requires developer resources. This may be doable to for interacting with a core upstream system but it isn't always available when you have two bottom level processes looking to communicate.

The ability for "Citizen Developers" to be able to obtain the data they need from an upstream process, complete the work on it inside their application, and then return the results back to the upstream process or next process in line without having to write code or otherwise manually intervene will further drive productivity and usefulness in this space.

Re: The “No Code” Delusion

#125
post #9

This delusion is especially visible in the DevOps space. For some reason we have decided as an industry that instead of writing some code in whatever 'real' language we will base operational work on YAML with ad-hoc templating and stringly-typed programming constructs. The main culprits are Ansible/Salt and all the string-templating based tools for Kubernetes (Helm/Kustomize/...). Especially with tools like Helm I be…

Powershell shines here.

DSC or pure powershell has bunch of useful tools and a real programming language to use in between. Yaml like configuration can be achieved with nested HashTables that have almost equivalent readability without loosing any of the devlopment capabilities.

Re: The “No Code” Delusion

#126
post #9

This delusion is especially visible in the DevOps space. For some reason we have decided as an industry that instead of writing some code in whatever 'real' language we will base operational work on YAML with ad-hoc templating and stringly-typed programming constructs. The main culprits are Ansible/Salt and all the string-templating based tools for Kubernetes (Helm/Kustomize/...). Especially with tools like Helm I be…

I'm reminded a bit of systemd. Whatever their problems, when things went south, it was usually fairly easy for someone who could code to walk through the init scripts involved and figure it out. The config files of systemd at first glance look quite simple and declarative, but if things don't work, one almost immediately slams into a wall of complexity.

Sometimes one doesn't "need" a coder because the system is such that it wouldn't do you any good anyway.

Re: The “No Code” Delusion

#127
post #33
post #24

Earlier quoted context omitted.

To play devils advocate, isn't the idea with Ansible at least that it's idempotent. The YAML should describe the final state and should be concerned with branching or lower level features like that. (It's the same with SQL, you describe what you want back rather than how its achieved. A declarative approach works fairly well there.)

However, that final YAML-defined state is not guaranteed to define the entire functionality of the system. The typical counterexample is this: removing a 'create file' clause does not cause that file to be removed on subsequent runs, as the tool has no concept of ownership nor diffing against previous states. The emitted YAML does not represent the indended full state of the machine, just what actions to take to brin…

> removing a 'create file' clause does not cause that file to be removed on subsequent runs, as the tool has no concept of ownership

Terraform on the other hand does have a concept of ownership, diff-ing, and applying changes. It takes some work as you now need to track state, but I've been very happy with Terraform.

Re: The “No Code” Delusion

#128

I read somewhere a quote that stuck with me: "No tool is ever going to free us from the burden of clarifying our ideas." And that's how I view my job as a software developer: clarifying ideas. Any "No Code" tool is still going to either force you to clarify your ideas, or have a large amount of assumptions. "Idea People" and "Business" don't like that, so they'll probably end up delegating the use of "No Code" tools…

There are plenty of tools that help us in clarifying our ideas though. Take mathematical notation for example. Or music notation. Or a CAD program. All are examples of domain specific tools that allow the user to specify their intention in a non-ambiguous way. And they also allow the user to think about and experiment with the problem space. I think what we need is something akin to this. The "business logic" that we…

Business domain vs. Math., that's an interesting comparison. The problem is that business domain is exact an "infinite domain", in comparing with Math. Or to say that the competitive nature of business is very much reliant on its ability to break its domain boundary. Again, not so much in the case of Math.

Re: The “No Code” Delusion

#129
post #24
post #9

This delusion is especially visible in the DevOps space. For some reason we have decided as an industry that instead of writing some code in whatever 'real' language we will base operational work on YAML with ad-hoc templating and stringly-typed programming constructs. The main culprits are Ansible/Salt and all the string-templating based tools for Kubernetes (Helm/Kustomize/...). Especially with tools like Helm I be…

To play devils advocate, isn't the idea with Ansible at least that it's idempotent. The YAML should describe the final state and should be concerned with branching or lower level features like that. (It's the same with SQL, you describe what you want back rather than how its achieved. A declarative approach works fairly well there.)

I'd argue somewhat that the approach works well for SQL. On a superficial level it allows you to hide the implementation details of your query execution. In practice not so much. Hence keywords like "explain" were invented and statements like "CREATE INDEX". And table partitioning. And hints. And myriad of other practices where the SQL abstraction "leaks" details from the layer below.

Re: The “No Code” Delusion

#130
post #9

This delusion is especially visible in the DevOps space. For some reason we have decided as an industry that instead of writing some code in whatever 'real' language we will base operational work on YAML with ad-hoc templating and stringly-typed programming constructs. The main culprits are Ansible/Salt and all the string-templating based tools for Kubernetes (Helm/Kustomize/...). Especially with tools like Helm I be…

YAML is okay for representing a simple declarative configuration. It starts to break down when you try to encode too much operational logic into it. If we step back, there are a few different strategies for dealing with operational logic. From least scalable to most (roughly): 1. Human processes (ex: checklist) 2. In the config itself (ex: Kubernetes' YAML) 3. A config generator (ex: Helm, Kustomize) 4. Software (ex:…

> simple declarative configuration

The point of all this is that software configuration is never a simple declaration. It is always a mess of behaviors and derived values.

I am not sure I totally agree, but it at least correct enough to always break something. And adding abstraction layers just because you choose to use an underpowered notation at the bottom isn't a good practice.

Post reply on HN