Open to short-term or long-term. Potentially open to relocation.
Email: contact@armichael.com
Resume: www.armichael.com/armichael_resume.pdf
Hi, I'm Andrew. I have experience doing backend/data/infra for small startups, I can work efficiently either with a team or independently, and I have wide exposure to a variety of technologies, problem spaces, and programming paradigms.
Skills:
- Scripting/tooling/automation/configuration in *nix environments
I'm a software engineer (backend/data/infra) with a background in college-level mathematics and CS education. Long-time Linux user, Emacs enthusiast, and adept juggler (I occasionally perform for charity and holiday events). I'm fond of expedition and sharp-set for new challenges, with wide exposure to a variety of technologies, problem spaces, and programming paradigms.
My recent work includes backend logic, backend API design + integrations, database schema design, AI vector search, media processing pipelines, and database + server administration for a startup's cross-platform mobile application.
Open to short-term or long-term. Potentially open to relocation.
Email: contact@armichael.com
Resume: www.armichael.com/armichael_resume.pdf
Hi, I'm Andrew. I have experience doing backend/data/infra for small startups, I can work efficiently either with a team or independently, and I have wide exposure to a variety of technologies, problem spaces, and programming paradigms.
"You're like a laser-guided missile I can point at technical problems" -- a past employer
Skills:
- Scripting/tooling/automation/configuration in *nix environments
I'm a software engineer (backend/data/infra) with a background in college-level mathematics and CS education. Long-time Linux user, Emacs enthusiast, and adept juggler (I occasionally perform for charity and holiday events). I'm fond of expedition and sharp-set for new challenges, with wide exposure to a variety of technologies, problem spaces, and programming paradigms.
My recent work includes backend logic, backend API design + integrations, database schema design, AI vector search, media processing pipelines, and database + server administration for a startup's cross-platform mobile application.
I'm a software engineer (backend/data/infra) with a background in college-level mathematics and CS education. Long-time Linux user, Emacs enthusiast, and adept juggler (I occasionally perform for charity and holiday events). I'm fond of expedition and sharp-set for new challenges, with wide exposure to a variety of technologies, problem spaces, and programming paradigms.
My recent work includes backend logic, backend API design + integrations, database schema design, AI-assisted media processing pipelines, and database + server administration for a startup's cross-platform mobile application.
Declaring a function with `lambda` prepends runtime nil checks for each argument to the function body (excluding optional args-- specified with a question mark, eg. `?x`-- and variable arguments, eg. `...`[1]).
This Fennel:
(fn foo [x y ...]
(print x y ...))
(lambda bar [x ?y ...]
(print x ?y ...))
...transpiles to this Lua:
local function foo(x, y, ...)
return print(x, y, ...)
end
local function bar(x, _3fy, ...)
_G.assert((nil ~= x), "Missing argument x on test.fnl:3")
return print(x, _3fy, ...)
end
[1] Fennel's alternative `& xs` vargs format does create a runtime check in functions declared with lambda, but it always evaluates to true because it simply nil-checks the table (here `xs`) that it dumps Lua `...` vargs into.
+1. And the subset of those applications concerned with simply converting result sets <-> JSON over HTTP may well even tolerate use of an API generator (eg PostgREST, PostGraphile, Hasura), reducing that thin layer to merely a membrane.
>functions that take sets as input and produce arbitrarily different sets as output
It is possible to return arbitrary sets from functions in many systems-- recent versions of the SQL standard even specify table functions (with syntax "RETURNS TABLE(columns)")[0] as well as polymorphic table functions (PTFs)[1]. And in addition to implementations of those standards, extensions like PL/[pg]SQL also have a few other ways of effecting table-like returns (parameter modes, composite type returns).
Right, I'm aware of table-returning functions and the general idea of functions as table sources in a FROM clause. I think the biggest gap is not having complementary table-consuming function signatures and ways to use functions as table sinks other than aggregate function calls.
I'd also want to allow a function to be both a table source and a table sink, which I think means that you might need a sub-query like syntax to supply the source that will be consumed by the function. This is a vague idea and not a well-defined language proposal:
CREATE OR REPLACE FUNCTION
-- invent a table-sink func signature?
func1( TABLE t1(a int, b text, c text) )
RETURNS TABLE (x int, y boolean) AS $$
-- access input set via declared name
SELECT
a, b < c
FROM t1
$$ LANGUAGE SQL;
CREATE OR REPLACE FUNCTION
func2( TABLE t1(a int, b boolean) )
RETURNS int AS $$
SELECT a WHERE b
$$ LANGUAGE SQL;
-- implicit positional matching of func input cols?
SELECT f1r.x, f1r.y
FROM func1( SELECT e1, e2, e3 FROM ...) AS f1r;
-- explicit input mapping to override positions?
SELECT f1r.x, f1r.y
FROM func1( SELECT e1, e2, e3 INTO b, a, c FROM ...) AS f1r;
-- function composition
SELECT func2(func1( SELECT e1, e2, e3 FROM ...));
Most (non-gigascale) applications that are non-trivial enough to use a relational database in the first place will benefit from using foreign key constraints (ie delegating enforcement of foreign key relationships to the database). Though, context can matter: system architecture, RDBMS limitations, etc. (eg IIRC, FK constraints complicate certain kinds of migrations in MySQL at scale).
>He rather have a smooth data migration process than having an unexpected error and abort the whole operation
That's not a good reason. It doesn't sound like he's making an educated decision based on context-- it sounds like he's sacrificing data consistency to make his own work easier.
If that's the case, perhaps he should do away with all integrity constraints (primary keys, checks, et al). Then, he could enjoy a "smooth process" for adding new data, too. No more pesky errors-- just blissful, silent corruption.
>To be fair, as far as I know, he never had major data problems.
Yet, anyway. He has intentionally limited his visibility over at least one kind of problem (invalid references). His problems might not be clear until they start causing noticeable issues elsewhere.
>He is not the only one I've met who insisted on not having FK. I've even seen large systems prohibit using JOIN statements.
Open to short-term or long-term. Potentially open to relocation.
Email: contact@armichael.com
Resume: www.armichael.com/armichael_resume.pdf
Hi, I'm Andrew. I have experience doing backend/data/infra for small startups, I can work efficiently either with a team or independently, and I have wide exposure to a variety of technologies, problem spaces, and programming paradigms.
Skills:
- Scripting/tooling/automation/configuration in *nix environments
- Relational databases and schema design
- API design and integrations
- Server and database administration
- Documentation, technical writing, diagrams, charts, runbooks
- Mathematics and logic (I have a wealth of experience in college-level education)
- Infrastructure administration and provisioning
- Analytics
- AI search and media processing
Technologies: Linux, PostgreSQL, Python, Emacs, Docker + docker-compose, misc Lisp and Scheme dialects, Java, Bash, Lua, Make, JavaScript / TypeScript + Node.js / Deno, Terraform, Ansible, Nginx, Caddy, AI, ML, LLMs, Metabase, AWS, GCP, Supabase, DigitalOcean, Netlify, HuggingFace; learning Nix