Historically, the difference between scripting languages and real programming
languages has been understood as the presence or absence of a compilation
step. However, in recent decades the distinction has blurred; from time to
time we have seen:
Interpreters for languages that were originally meant to be compiled.
Compilers for languages that were originally meant to be interpreted.
Scripting engines internally converting source code to bytecode before
interpreting it.
Real languages compiling to bytecode which is then mostly interpreted and
rarely converted to machine code.
So, compiled vs. interpreted does not seem to be the real differentiating
factor; nonetheless, we can usually tell a scripting language when we see one.
So, what is it that we see?
My notes on Devoxx 2016 Belgium - Microservices Evolution: How to break your monolithic database by Edson Yanaga (I attended this conference)
Reduce maintenance window
Achieve zero downtime deployments
"Code is easy, state is hard"
Changes in a database schema from one version to another are called database migrations
Tools: Flyweight Liquibase
Migrations require back and forward compatibility
Baby steps = Smallest Possible Batch Size
Too many rows = Long Locks
Shard your updates (not updating the entire table in one go)
Renaming a column
ALTER TABLE customers RENAME COLUMN wrong TO correct; becomes:
ALTER TABLE customers ADD COLUMN correct VARCHAR(20); UPDATE customers SET correct = wrong WHERE id < 100; UPDATE customers SET correct = wrong WHERE id >= 100 AND id < 200; ... (later)ALTER TABLE customers DELETE COLUMN wrong;
Adding a column ADD COLUMN, setting NULL/DEFAULT value/computed value Next release: Use Column
Renaming / Changeing Type / Format of a Column: Next version: ADD COLUMN, Copy data using small shards Next release: Code reads from old column and writes to both Next release: Code reads from new column and writes to both Next release: Code reads and writes from new column Next release: Delete old column
Deleting a column
Next version: Stop using the column but keep updating the column Next version: Delete the column
For migrating from a monolithic application with a monolithic database to many microservices with own database each:
Using Event Sourcing
tool: debezium.io You tell it which tables you want to monitor, and from then on it monitors them and generates an event for each DDL/DML statement you issue. The event is propagated to as many event consumers as you want. So, microservices can receive these events and update their own databases.
"HTTP and REST are incredibly slow"
My notes on Devoxx US 2017, Knowledge is Power: Getting out of trouble by understanding Git by Steve Smith
"If that doesn't fix it, git.txt contains the phone number of a friend of mine who understands git. Just wait through a few minutes of 'It's really pretty simple, just think of branches as...' and eventually you'll learn the commands that will fix everything."
My notes on GOTO 2015 - Progress Toward an Engineering Discipline of Software - Mary Shaw
Notes
17:28 past the bridges and into software engineering
Software Engineering is all design. Production used to be printing the CDs, and nowadays it is hitting the "deploy" button.
"scaling the costs to the consequences" -- the point is not to minimize the cost, the point is to scale it to the consequences. Risks must be taken, and if the potential gains are huge, then the risks can be correspondingly large.
My notes on GOTO 2014 - REST: I don't Think it Means What You Think it Does - Stefan Tilkov
"People decide they want to build something in a RESTful fashion, so they spend all their time arguing about where the slashes go".
"It is the first litmus test for your REST API whether you depend on specific characters in your URIs for things to work."
(From the client's point of view.)
"Version numbers in URIs just suck. Everybody does it which doesn't make it any less sucky. It is a stupid idea. Don't do that."
"The version number is in the URI because the URI is the API". <-- ? I would assume the URI is NOT the API.
Versioning: "Version your documentation documents. Wait what? --Yes, no versioning".
Postel's law "TCP implementations should follow a general principle of robustness: Be conservative in what you do, be liberal in what you accept from others." http://tools.ietf.org/html/rfc761
Client rules Don't depend on URI structure Support unknown links Ignore unknown content
Server rules Don't break URI structure unnecessarily Evolve via additional resources Support older formats
If you were thinking of installing the "Andy" android emulator on your PC, think again. Here is my experience with it:
The installable file (Andy_46.2_207_x64bit.exe) is 431 MB, so it took a really long time to download.
It installed VMware without asking me, so the installation took a really long time.
It installed some "Bonjour Service" by Apple, Inc. without asking me.
It replaced all my .apk icons with its own icon without asking me. (I am using apk shell extension and I much prefer it that way.)
During installation, there were 15 attempts to call home by "Andy" and/or by other crapware that it installed. (I have a firewall, so I didn't let any of that happen.)
At the end of the installation, it popped up a message box saying that the installation failed because it could not detect my internet connection, and that it requires internet access in order to install.
Despite the failed installation message, "Andy" was found under "installed programs" so I uninstalled it.
During uninstallation there were a couple of more attempts to call home.
After uninstallation it left "Bonjour Service" installed, so I had to go find it and uninstall it too.
After uninstallation it left an "Andy" folder on the root of my user folder, which I had to delete.