Мы не пишем в техподдержку
9 постов
9 постов
6 постов
16 постов
3 поста
3 поста
9 постов
2 поста
Компактная и портабельная программа, четко выполняющая свое предназначение — редкая для современного мира красота и услада для глаз опытного разработчика. Именно такие проекты, реализующие серверы и клиенты для веба вы найдете в этой статье.
Есть много причин, по которым миниатюрные девушк.. ээ реализации программ заслуживают внимания:
обучение — врядли получится разобраться как устроен вебсервер, перелопачивая исходники монстров вроде Apache или Nginx, спасет только миниатюрная реализация;
основа для собственных проектов — большой объем чужого исходного кода под капотом вашего проекта будет висеть гирей и отвлекать ресурсы на поддержку, в отличие от чего-то маленького и простого;
борьба с энтропией — популярные библиотеки постоянно растут и раздуваются, при этом объем используемого функционала не особо меняется. Таким образом, большая часть кода в современном проекте с кучей внешних библиотек не используется никогда.
Разумеется есть определенные риски использования таких «наколенных» библиотек, связанные с неполной реализацией, безопасностью, работой под нагрузкой и так далее.
Но говоря откровенно, всего этого хватает с головой и в больших, известных реализациях, которые вы используете каждый день на работе.
Еще с опытом приходит понимание, что любая программа — не более чем инструмент а реальную опасность всегда представляют живые люди, а не тупые машины.
Не стал опять заморачиваться с *BSD, чтобы в третий раз не описывать специальную прослойку epoll-shim, позволяющую быстро и более-менее безболезненно портировать серверный софт с линукса. На этот раз в качестве тестового окружения выступает обычная Ubuntu Linux 25.10, хотя и с немного нестандартным ядром.
Компилятором выступит штатный же GCC, без изысков:
gcc version 15.2.0 (Ubuntu 15.2.0-4ubuntu4)
Начнем погружение с весьма практичного проекта:
A tiny (~800sloc) embeddable HTTP server written in C89, compatible with Linux, OSX and Windows.
800 строк на чистом С, причем наиболее портабельного стандарта С89, c поддержкой Windows, Linux и MacOS — отличный набор для реального применения, например в качестве встроенного вебсервера для WiFi-роутера.
Один из примеров, демонстрирующих работу этой библиотеки — на заглавном скриншоте к статье, причем показана обработка вебформы.
Вот так выглядит сборка примера:
cd example
gcc hello.c ../src/*.c -I../src -std=c89 -pedantic -Wall -Wextra -o hello
Так выглядит код тестового приложения с использованием этой библиотеки:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "sandbird.h"
static int event_handler(sb_Event *e) {
if (e->type == SB_EV_REQUEST) {
printf("%s - %s %s\n", e->address, e->method, e->path);
sb_send_status(e->stream, 200, "OK");
sb_send_header(e->stream, "Content-Type", "text/plain");
sb_writef(e->stream, "Hello world");
}
return SB_RES_OK;
}
int main(void) {
sb_Options opt;
sb_Server *server;
memset(&opt, 0, sizeof(opt));
opt.port = "8000";
opt.handler = event_handler;
server = sb_new_server(&opt);
if (!server) {
fprintf(stderr, "failed to initialize server\n");
exit(EXIT_FAILURE);
}
printf("Server running at http://localhost:%s\n", opt.port);
for (;;) {
sb_poll_server(server, 1000);
}
sb_close_server(server);
return EXIT_SUCCESS;
}
Важный нюанс:
сервер не использует многопоточность, все клиентские обработчики работают в одном потоке.
зато с неблокирующими сокетами:
..
static void set_socket_non_blocking(sb_Socket sockfd) {
#ifdef _WIN32
u_long mode = 1;
ioctlsocket(sockfd, FIONBIO, &mode);
#else
int flags = fcntl(sockfd, F_GETFL);
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
#endif
}
..
Следующий интересный и даже в чем-то уникальный проект, с лаконичным описанием:
a simple websocket server library.
Реализует с помощью ~700 строк на С89.. серверные вебсокеты!
Вебсокеты это чаты, это «live-streaming», это например отображение логов в реальном времени и тому подобные динамические штуки.
Так это выглядит в действии:
Так выглядит сборка тестового приложения:
gcc -c *.c examples/test.c -Wall -Wextra -Wpedantic -Wno-overlength-strings -std=c89
gcc -o webs *.o -lpthread
Как нетрудно догадаться по -lpthread, тут уже используется многопоточность на базе POSIX threads:
..
static void* __webs_main(void* _srv) {
webs_server* srv = (webs_server*) _srv;
webs_client* user_ptr;
webs_client user;
for (;;) {
user.fd = __webs_accept_connection(srv->soc, &user);
user.srv = srv;
if (user.fd >= 0) {
user_ptr = __webs_add_client(srv, user);
pthread_create(&user_ptr->thread, 0, __webs_client_main,
user_ptr);
}
}
return NULL;
}
..
К сожалению этот интересный проект по большей части прототип, иллюстрирующий как можно на коленке без внешних библиотек реализовать серверную сторону вебсокетов на чистом С.
В случае реального использования, столь вольное использование malloc для обработки входящих пакетов быстро превратится в проблему:
..
/* deal with normal frames (non-fragmented) */
if (WEBSFR_GET_OPCODE(frm.info) != 0x0) {
/* read data */
if (data) free(data);
data = malloc(frm.length + 1);
..
Так выглядит сокращенная версия тестового сервера вебсокетов, c минимумом обработчиков:
#include "../webs.h"
int myFuncZ(webs_client* self) {
printf("server %ld: (id %ld) connected!\n",
self->srv->id, self->id);
webs_send(self, "greetings, salutations!");
return 0;
}
int myFunc2(webs_client* self) {
printf("server %ld: (id %ld) disconnected!\n",
self->srv->id, self->id);
return 0;
}
int main(void) {
webs_server* server1 = webs_start(7754);
if (!server1) {
printf("failed to initialise a server.\n");
return 1;
}
server1->events.on_open = myFuncZ;
server1->events.on_close = myFunc2;
webs_hold(server1);
webs_close(server1);
return 0;
}
Как видно из кода выше, все интересное происходит именно в обработчиках, где собственно и будет находиться ваша собственная логика, если вдруг решитесь использовать эту штуку.
Повторюсь, что весь этот проект, несмотря на всю свою интересность — сырой прототип и тащить в прод подобный код без переработки, "as-is" точно не стоит.
Собирается только для Linux и только с помощью gcc.
Прототип как он есть.
Это уже куда более зрелая библиотека:
A C++ header-only HTTP/HTTPS server and client library
11к строк кода на C++11 и несколько зависимостей от внешних библиотек:
pthreads, brotli, OpenSSL, zlib
Реализуют весьма продвинутый HTTP/HTTPS сервер и клиент, причем фактически в одном файле. Есть поддержка сборки как на Linux так и Windows, причем для второй есть готовый проект для Visual Studio.
Разумеется это не мейнстрим и к качеству есть вопросы, зато все уместилось в очень небольшом коде, без особых ухищрений по миниатюризации и потому вполне читаемому.
Так выглядит сборка тестового сервера, использующего эту библиотеку:
g++ -o server -O2 -std=c++11 -I.. -Wall -Wextra -pthread \
server.cc -DCPPHTTPLIB_OPENSSL_SUPPORT -lssl -lcrypto \
-DCPPHTTPLIB_ZLIB_SUPPORT -lz -DCPPHTTPLIB_BROTLI_SUPPORT \
-lbrotlicommon -lbrotlienc -lbrotlidec
По флагам вроде CPPHTTPLIB_ZLIB_SUPPORT можно заметить, что большая часть зависимостей на самом деле опциональна и отключаема.
Еще думаю, заблудиться в 11к строчках кода и одном единственном файле будет проблематично даже у
нейросетине самых опытных «плюсолюбов».
Так выглядит серверный «Hello, world!»:
#include <httplib.h>
using namespace httplib;
int main(void) {
Server svr;
svr.Get("/hi", [](const Request & /*req*/, Response &res) {
res.set_content("Hello World!", "text/plain");
});
svr.listen("0.0.0.0", 8080);
}
Код в лучших традициях Django или Rails, тут есть маршрутизация запросов и привязка к URL — в данном случае обработчик связывается с урлом /hi.
Вот так выглядит обработка загрузки файлов с помощью формы и POST-запроса:
#include <fstream>
#include <httplib.h>
#include <iostream>
using namespace httplib;
using namespace std;
const char *html = R"(
<form id="formElem">
<input type="file" name="image_file" accept="image/*">
<input type="file" name="text_file" accept="text/*">
<input type="submit">
</form>
<script>
formElem.onsubmit = async (e) => {
e.preventDefault();
let res = await fetch('/post', {
method: 'POST',
body: new FormData(formElem)
});
console.log(await res.text());
};
</script>
)";
int main(void) {
Server svr;
svr.Get("/", [](const Request & /*req*/, Response &res) {
res.set_content(html, "text/html");
});
svr.Post("/post", [](const Request &req, Response &res) {
const auto &image_file = req.form.get_file("image_file");
const auto &text_file = req.form.get_file("text_file");
cout << "image file length: " << image_file.content.length() << endl
<< "image file name: " << image_file.filename << endl
<< "text file length: " << text_file.content.length() << endl
<< "text file name: " << text_file.filename << endl;
{
ofstream ofs(image_file.filename, ios::binary);
ofs << image_file.content;
}
{
ofstream ofs(text_file.filename);
ofs << text_file.content;
}
res.set_content("done", "text/plain");
});
svr.listen("localhost", 1234);
}
Так это выглядит в действии:
Разумеется подобный функционал — не откровение, особенно на 2026й год, но блин:
11к строк кода на всю красоту!
Теперь переходим к миниатюрным реализациям протокола FTP — для передачи файлов, если кто вдруг забыл.
Вот такой «игрушечный» проект:
a tiny FTP server written in C++
Всего 1.5к строк на С++11 от безвестного китайского автора реализуют полнофункциональный FTP/FTPS‑сервер — с chroot, поддержкой локальных и анонимных юзеров и всем прочим.
FTPS это довольно редко встречающееся расширение протокола FTP, с поддержкой шифрования передачи данных. Не набравшее большой популярности ввиду появления SFTP и органичений самого FTP и потому мало известное широкой админской публике.
В работе:
Проект использует известную библиотеку libnet, о чем автор забыл сообщить и которую необходимо установить до сборки:
apt install libnet1-dev
Сама сборка происходит с помощью обычного cmake:
mkdir build && cd build
cmake ..
Реализация FTP-сервера тут максимально классическая — используется chroot а использование 21 и 20 портов зашито в код:
..
int socketfd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_port = htons(21);
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
..
Все это означает, что запускать сервер придется от суперпользователя:
sudo ./tiny_ftpserver ../tiny_ftpserver.conf
У этого проекта есть один неожиданный нюанс:
на самом деле это.. студенческая работа.
И подобных проектов на Github оказалось великое множество. Так что далеко не везде в 2026м году забыли что такое высшее техническое образование, что не может не радовать.
Следующий интересный и весьма редкий проект:
FineFTP is a minimal FTP server library for Windows and Unix flavors.
~2k строк на С++14 реализуют FTP-сервер в виде.. библиотеки!
В этом и есть основная фишка этого проекта — возможность встроить FTP (причем сервер а не клиент) в ваше собственное приложение.
Так выглядит код примера, с внедрением FTP-сервера:
#include <fineftp/server.h>
#include <thread>
int main() {
// Create an FTP Server on port 2121. We use 2121 instead of the default port
// 21, as your application would need root privileges to open port 21.
fineftp::FtpServer ftp_server(2121);
// Add the well known anonymous user. Clients can log in using username
// "anonymous" or "ftp" with any password. The user will be able to access
// your C:\ drive and upload, download, create or delete files. On Linux just
// replace "C:\\" with any valid path. FineFTP is designed to be cross-platform.
ftp_server.addUserAnonymous("C:\\", fineftp::Permission::All);
// Start the FTP Server with a thread-pool size of 4.
ftp_server.start(4);
// Prevent the application from exiting immediately
for (;;) std::this_thread::sleep_for(std::chrono::milliseconds(100));
return 0;
}
Зачем и для чего такое может быть нужно — другой вопрос, все же обычно работу с файлами в конечном приложении (например обновление прошивки) стараются реализовать в виде клиента и через HTTP/HTTPS.
Но с точки зрения использования все отлично работает:
Это хорошая, взрослая библиотека, с несколькими коммитерами, с историей разработки, которая активно поддерживается и развивается.
Старого цирка с chroot и 21м портом тут нет, поэтому все работает без привилегий суперпользователя — на скриншоте выше как раз видно использование нестандартного порта для работы.
Поддерживается сборка для Linux, MacOS и Windows c приоритетом для последней.
Отличный проект, но далеко не последний в сегодняшней подборке.
Этот проект — привет из далекого и славного прошлого:
This is a modern re-implementation of rcp (remote copy protocol) daemon, originally part berkeley r-commands.
Да, это самый настоящий сервер RCP, всего 300 строк на Golang от знаменитого в узких кругах компьютерных реконструкторов автора Tenox.
RCP, если кто вдруг не знает, это такой устаревший протокол передачи файлов между компьютерами с UNIX, мало пригодный для использования в современных реалиях, ввиду отсутствия какого-либо шифрования и авторизации.
Но крайне актуальный, если имеете дело с устаревшим оборудованием или встраиваемыми системами, которые до сих пор используют rcp для например загрузки обновлений прошивок по сети.
Возвращаясь к проекту:
rcpd от Tenox реализует серверную сторону — сервер RCP
К этому серверу подключаются клиенты для загрузки или скачивания файлов. Так выглядит процесс копирования файла, в качестве клиента тут rcp из пакета GNU Inetutils:
Как видите и клиент и сервер запускаются от суперпользователя — такие были времена, RCP использует 514 порт, который нельзя занять без привилегий.
Сборка:
go build -o rcpd .
Кстати в Makefile проекта есть поддержка кроссплатформенных сборок, с весьма богатым выбором:
Стоит добавить, что протокол RCP сам по себе очень простой и не менялся весь период своего существования, что позволяет подключаться к этому RCP-серверу 21 века даже с помощью клиентских программ из 80х и 90х.
Детально разобрать удалось лишь малую часть интересных находок, поэтому ниже буквально одной строкой про интересные миниатюрные, точно заслуживающие внимания.
Парсер строк URL на чистом С и без зависимостей:
This is a small library to parse and manipulate URLs in conformance to RFC 3986 and (most of) the WHATWG specification.
Что умеет:
No allocations
No dependencies
The ability to switch between RFC 3986 and WHATWG with a flag
Relative reference parsing and resolution
URL normalization
Doesn't rely on null-terminated strings
Еще один интересный проект миниатюрного FTP-сервера:
Small x86-32/x64 FTP Server
Поддерживается сборка под Linux/Windows/Mac, сам проект не мертвый и судя по коммитам — развивается.
Весьма специфичная реализация FTP-сервера для встраиваемых систем:
Minimal FTP Server that can run on an ESP8266 with MicroPython
Так я впервые узнал о существовании «микропетона» — давно существующего проекта, с огромным количеством поддерживаемого железа и широким функционалом.
Ну и в качестве финального аккорда:
FTP Server for 3DS/Switch/Linux.
Реализация FTP-сервера для.. Nintendo Switch!
Это такая игровая консоль для гиков если кто вдруг не в курсе:
Статья была опубликована на Хабре, оригинал как обычно в нашем блоге.
Продолжаю рассказывать о своих вело-путешествиях по Питеру и Ленинградской области. На этот раз заехал в город Пушкин - бывшую царскую дачу, поглазеть как отдыхали цари-императоры до революции.
На этот раз никаких рекордов по длине и толщине расстоянию не будет, поскольку формально Пушкин это часть Питера и тут всего лишь 25 км по прямой, такой маршрут легко осилит даже подросток или солевой наркоман.
Ну что сказать, цари-императоры понимали в отдыхе и "дача" действительно эпическая:
Большо́й Екатери́нинский дворе́ц — императорский дворец, официальная летняя резиденция российских правительниц: Екатерины I, Елизаветы Петровны, Екатерины II.
Красоты неимоверной, несмотря на то что дворец сильно пострадал во вторую мировую.
Для оценки масштаба:
Посмотрел и на Екатерининский собор:
Екатери́нинский собо́р (собо́р свято́й великому́ченицы Екатери́ны) — православный храм в центре города Пушкина (Царское Село), главный храм Пушкинского (Царскосельского) благочиния Санкт-Петербургской епархии Русской православной церкви.
Все блестит и сверкает, что имеет причины:
Собор был построен в 1835—1840 годах по проекту Константина Тона, разрушен коммунистами в 1939 году, воссоздан в 2007—2010 годах на прежнем месте.
Так что формально это новодел.
Немного киношности:
На обратном пути заснял Питер с новой точки:
Мой братец недавно решил заняться историческими изысканиями и раскопать семейное древо предков. То что он выяснил затыкает за пояс всю эту вашу «Игру Престолов», ну а реальная жизнь моих далеких предков оказалась покруче фентези про каких-то там зомби и драконов.
Как и любой житель современного мегаполиса, я большую часть жизни был сильно далек от своих корней и даже не подозревал, что возможно отследить древо предков настолько далеко.
Особенно если ты не английский лорд.
Но оказалось, что и в наших сибирских краях велись исторические записи и проводились переписи, которые и позволили в итоге найти информацию о своих далеких предках. Даже если они не занимали министерские посты и не были знатного происхождения.
Собранное дерево можно увидеть вот тут или тут , оно обновляется по мере нахождения новых данных.
Слово автору:
Когда четыре года назад я начинал работать с историей семьи, особых ожиданий у меня не было. Но было любопытно. Мне кажется, что наше поколение в целом выросло с установкой, что история туманна, а архивы за бурный 20 век потеряны или уничтожены.
Но оказалось для моих предков это совсем не так. Благодаря большой работе, проделанной Государственным архивом Курской области, мне удалось проследить историю рода до середины 17 века.
Вот что удалось выяснить на сегодняшний день (самый самый верх):
На фото выше фрагмент ревизской сказки 1762 года Корочанского уезда Верхнего стану села Семицы, в ней упоминается мой предок восьмого поколения Андрей Тимофеев Чернышев (1729-1803), однодворец.
Если даты вас не впечатлили, напомню что вторжение Наполеона было в 1812м — получается что найденный предок старше тех событий.
Выдержка с переведенным текстом:
Но это еще не все, поскольку нашлись еще более дальние родственники:
1640 год это времена правления Алексея Михайловича «Тишайшего», разборки с Никоном, Соборное Уложение — все что вам рассказывали на уроках истории в школе.
А как вам такое:
«И Государь, говоря с Бояры, велел Боярина Князь Дмитрия Пожарского вывесть в город, и велел его Князь Дмитрия за бесчестье Боярина Бориса Михайловича Салтыкова выдать Борису головою и в Разряд то велел записать. А посыланы по него на двор Перфилий Иванов сын Секирин да Голова Стрелецкий Костентин Чернышев. А отводил Боярина Князь Дмитрия Михайловича Пожарского на двор к Боярину Борису Михайловичу Салтыкову головою Перфилий Иванов сын Секирин».
Дмитрий Михайлович Пожарский это если что тот чувак, который изгонял из Москвы ляхов задолго до того как это стало мейнстримом.
Это вам не китайские порномультики про тентакли и не «Игра Престолов», это живая история, в которой в полный рост участвовали мои предки.
Но разумеется в такое непросто поверить, тем более что фамилия «Чернышев» очень распространенная, поэтому ниже будет изученная история моей семьи (с пруфами) по мужской линии, начиная с деда.
Чернышев Кузьма Данилович, родился 11 ноября 1923 года на Алтае:
Алтайская губерния, Рубцовский уезд, Курьинская волость, с. Курьинское
Ныне это село Курья, основанное на минуточку в 1749м году!
За 60 лет до вторжения Наполеона в Российскую Империю, если вы плохо в датах ориентируетесь.
В 1941 добровольцем пошел на фронт, валить очередных захватчиков, где немало приуспел — закончил войну аж в Берлине в звании младшего сержанта. Воевал в составе 8й гвардейской воздушно-десантной дивизии, был награжден Орденом Отечественной войны I степени.
Инициатор: Министр обороны СССР | | Реквизиты документа: ЦАМО. Юбилейная картотека награждений, шкаф 61, ящик 2. Номер документа 87.
К сожалению умер когда мне было три года, поэтому рассказать его историю из первых уст не получится.
Чернышев Данил Феофанович, родился 9 декабря 1900 года в том же самом селе Курьинское, которое тогда имело другую принадлежность: Томская губерния, Змеиногорский уезд, Курьинская волость, с. Курьинское.
Вот как это происходило:
В XIX веке, в связи с бурным развитием сельского хозяйства и экономики Южной Сибири, село становится административным центром Курьинской волости, относящейся к Бийскому уезду Томской губернии. В 1894 году из части волостей юго-западных территорий Бийского уезда (в том числе — Курьинская волость) создаётся новый Змеиногорский уезд Томской губернии.
Под воздействием революционной пропаганды комиссаров. представителей партии социалистов-революционеров, в 1905 году в Курье, как и в целом по Змеиногорскому уезду, прошли революционные волнения крестьян, общество которых, как и всегда во время революций, все разделилось на тех, кто поддерживал революционеров и на тех, кто хотел бы сохранить старый уклад жизни.
Летом 1917 года решением Временного правительства Российской державы южные волости и уезды выводятся из состава Томской губернии и образуют вновь создаваемую Алтайскую губернию.
И его сын — мой дед родился уже на Алтае, но в том же самом селе:
«Хлебопаш» епта! А не какой-то там мамкин Senior Developer.
Чернышев Феофан Прокофиевич, родился между маем 1865 и ноябрем 1866 (крестьяне ориентировались по временам года в те времена), вот в этом интересном месте:
Сеймица, Солнцевский муниципальный район, Курская область
Деревня и те места в целом — непростые, в них происходили события исторического масштаба, поэтому про них расскажу подробнее чуть ниже.
Фотографий предков дальше не будет, поскольку фотоаппаратов с айфонами у крестьян-хлебопашцев в те времена разумеется не было. Зато остались документы, сканы которых я и буду показывать.
И начнем мы вот с такого документа от 1917го года (последние дни Российской Империи, между прочим):
Ф. 233. Оп. 1 Б. Д. 212 том 7. Анкеты сельскохозяйственной переписи села Курья Курьинской волости Змеиногорского уезда
Краевое государственное казенное учреждение Дело Ф. 3 Оп. 1 Д. 905 Алфавитная книга учета переселенцев 1893 г.
Это заполненная карточка сельскохозяйственной переписи 1917года на моего пра-пра-деда. Вот немного информации о происхождении этого документа:
Сельскохозяйственные переписи 1916 и 1917 годов — мероприятия отечественной статистики по сбору данных о состоянии агропромышленного сектора экономики, осуществлённые в последние годы существования Российской империи министерством земледелия при помощи земств. Подготовка к сельскохозяйственной переписи, которую предполагалось провести в декабре 1915 года, началась в 1913 году. Как источник по социально-экономической истории России начала XX века, эти переписи дают лишь фрагментарную картину: в условиях начавшейся в августе 1914 года Первой мировой войны при их проведении не удалось обеспечить полностью всероссийский охват и собрать все данные в изначально запланированном объёме[1][2]
Короче очень сильно повезло, что в те бурные годы статисты добрались до этих диких мест и сделали записи.
Надо отметить, что мой далекий предок жил очень даже неплохо — 18 голов скота и 50 гектар земли, немало даже по нынешним меркам. Не олигарх, но на ногах стоял крепко.
Обратите внимание на вот эту часть:
Тут видно что предок был переселенцем, перебрался в Сибирь в 1893 м и самое важное — написано откуда он приехал.
Чернышев Прокофий Стефанов, родился примерно в 1844 (точных документов не нашлось) в деревне Сеймица, Солнцевского муниципального района, Курская области.
А затем он переселился в Сибирь:
Кстати «Стефанов» это не вторая фамилия, а старое написание отчества — сын Стефана, дословно. Далее все отчества будут в такой форме.
Копаем дальше.
Чернышев Стефан Потапов, родился в 1804м году в той же самой деревне Сеймица, Солнцевский муниципальный район, Курская область.
Застал вторжение Наполеона, хотя видимо до тех мест война не дошла.
Вот полученная выписка из архива, который на удивление хорошо сохранился в Курской области:
Оригинал:
Немного матчасти:
Реви́зские ска́зки — документы, отражающие результаты проведения подушных переписей (ревизий) податного населения Российской империи в начале XVIII — 2-й половине XIX веков, проводившихся с целью налогообложения. Ревизские сказки представляли собой поимённые списки населения, в которых указывались имя, отчество и фамилия (при её наличии) главы семьи, его возраст, имя и отчество членов семьи с указанием возраста, отношение к главе семьи. В ревизских сказках (за некоторыми исключениями) учитывались лица мужского и женского пола, но в сводных таблицах женский пол никогда не фигурировал.
Но едем дальше, благо это еще не конец.
Чернышев Потап Андреев, родился в 1767м, времена правления Екатерины II.
Все в той же деревне Сеймица, Солнцевский муниципальный район, Курская область.
Выдержка с переведенным текстом:
А вот скан оригинала:
Чтобы вы понимали насколько это все древнее, вот скан обложки:
Чернышев Андрей Тимофеев, родился в 1729м году, все в той же деревне Сеймица, Солнцевский муниципальный район, Курская область — практически родовое гнездо.
Будучи рожденным в 1729м, мой далекий предок застал времена правления Петра II и Анны Иоанновны.
Выписка с переводом:
Начинает мелькать слово «однодворец», чуть ниже расскажу об этом подробнее. Оригинал:
Еще немного перевода:
«Андрей Тимофеев сын Чернышев» это Андрей Тимофеевич Чернышев по современному. Обложка документа:
1812й год, тот самый в который случилась Отечественная война и разборки с Наполеоном.
Чернышев Тимофей Лазарев, к сожалению год рождения установить не получилось, но думаю это примерно конец 1690х — судя по переписи его сыну в 1795м было уже 66 лет.
Выходит что мой далекий предок — современник Петра I, который этот ваш Питер на болоте построил.
Родился мой пра-пра-пра-пра-пра-пра-пра-дед все в том же селе Семице, которая внезапно оказывается старше Санкт-Петербурга.
Так что не туда вы все ездите за историей, совсем не туда ;)
Выписка с переводом:
А вот так выглядит скан оригинала:
Чернышев Лазарь Костентинов, -
К сожалению на этом предке доступная информация теряется, не получилось раскопать никаких деталей.
Даже имя-отчество были взяты сопоставлением записей из разных версий «сказок».
Зато нашелся его сын Яков, который приходится мне дядей пра-пра-пра-пра-пра-пра-пра-деда.
Чернышев Яков Лазарев, 1720 — 1767, все тоже село Семицы «Корочанского уезду Вернего стану»
Выписка:
Скан оригинала:
Документ 1762 года, времена уже Петра III.
Вот так выглядит обложка:
Чернышев Костентин, -
Единственная найденная информация (перевод разумеется):
Получается что жил Никита Костентинович Чернышев и дожил аж до 70 лет — без антибиотиков и врачей. Путем нехитрых расчетов получаем что родился он в 1682 м году, отнимаем 20 лет и получаем примерную дату рождения его отца Костенина Чернышева:
1662 год.
Это времена правления Алексея Михайловича, когда самодержца еще звали царем а не императором.
Путем небольшого гугления нашелся интересный документ, с вот такими выдержками:
..
Да, есть очевидный разрыв в датах, но и людей в те годы было сильно меньше, поэтому с высокой долей вероятности это и есть мой далекий предок.
Ну а мы продолжаем поиски, делаем новые запросы и есть все шансы что получится восстановить древо предков еще дальше.
Напоследок расскажу почему мои предки стали переселенцами, покинув родовое гнездо — ту самую деревню Семицу.
Заодно затрону тему с «однодворцами».
Вся статья вот тут, ниже выдержки:
В 1850 году в Тимском уезде Курской губернии случились крестьянские волнения.
Государственные крестьяне — однодворцы — отказались участвовать в очередной переписи населения и давать рекрутов в армию, выдвигали ряд требований экономического и социального характера.
Волнения приключились в деревнях Зуевке, Донецкой Семице и Сараевке, в них участвовало 1132 «души мужеского пола».
Над усмирением недовольных бились уездный исправник, курский губернатор, сенатор из Петербурга и другие официальные лица — в деревни ввели войска. Дело дошло до царя — Николай Первый повелел навести порядок, а зачинщиков наказать жестоко.
...
Когда же они сошлись в одну толпу и к ним присоединились крестьяне деревень Донецкой Семицы и Сараевки, жандармский капитан Герасимов объявил письмо Министерства госимуществ в адрес губернатора о внушении им обязанности писаться по сказкам 9-й ревизии.
..
3 октября 1850 г. командующий 1-м резервным кавалерийским корпусом Г. Ф. Пиллар фон Пильхау рапортует Николаю I о том, что ревизская перепись казенных крестьян в деревнях Зуевка, Сараевская и Донецкая-Семица окончена и рекрутский набор произведен. Однако один из эскадронов был оставлен в волнующихся деревнях.
..
Другими словами из-за одного долбо#ба архивариуса, неверно трактовавшего закон начались массовые беспорядки, погромы и волнения. А власть поступила как обычно — ввела тогдашний ОМОН в виде полка улан.
Дальше полетели головы:
14 сентября курский губернатор А. П. Устимович за допущенные в губернии беспорядки отставлен от службы с преданием суду. Это произошло в результате интриг курского дворянства, а также не без участия ревизора - сенатора Дурасова. Крестьянские волнения лишь послужили удачным поводом поставить точку в его карьере.
Наказали виновных:
- архивариус Старостин этим решением должен бы быть лишен дворянства и определен рядовым по назначению Инспекторского департамента.
Накатали жалобы:
Во время суда и следствия крестьяне в 1852 г. подали в военно-следственную комиссию жалобу на разорение их военной командой, жестокость и взяточничество тимского уездного исправника.
На которые по традиции забили:
Рассмотрение жалобы затянулось до 1855 г., когда крестьянам сообщили об оставлении ее без последствий.
Как будто дело происходило не 200 лет назад, а вчера — настолько сильны традиции в России.
Посмотрев и по всей видимости ощутив на себе всю мощь сапога государственной машины принуждения, мои далекие предки и решили валить как можно дальше от царской власти — на Алтай, который был тогда практически краем света.
Но все же эти волнения породили записи, многие из которых сохранились до наших дней и дают надежду на дальнейшее изыскания:
В «Статистических сведениях по Тимскому уезду» за 1886 год (выпуск № 12 «Сборника статистических сведений по Курской губернии») мы находим описание Двоелученской волости и окрестностей: «Подворную форму землевладения имеют все четвертные крестьяне.
Судя по документам, происхождение четвертного землевладения здесь относится к XVII–XVIII столетиям.
Предки настоящих четвертных крестьян — боярские дети, получившие землю за сторожевую пограничную службу.
Как нетрудно догадаться, шанс найти записи по детям бояр куда выше и видимо получится протянуть древо в начало XV-го века — времена Ивана Грозного.
А вы говорите «Игра Престолов».
Видимо надо написать Эрику и просить вернуть боярский костюм — как историческому владельцу :)
Автор в историческом прикиде, фото Эрика.
Пока вы рождались, ходили в школу, заканчивали учебу и выходили на свою первую работу, на свете существовал совершенно особенный набор компиляторов, о котором крайне мало известно на просторах РФ.
Именно о нем пойдет сегодняшний рассказ.
Врядли среди читателей обнаружится аксакал живой пользователь этого удивительного проекта:
The Amsterdam Compiler Kit is a venerable piece of software that dates back to the early 1980s. It was originally written by Andrew Tanenbaum and Ceriel Jacobs as a commercial product; for many years it was also used as Minix’ native toolchain. After eventually failing as a commercial project, it was made open source under a BSD license in 2003 when it looked like it was going to be abandoned and the code lost.
Сочетание «начало 80х» и «коммерческий продукт» оставляет мало шансов на появление пользователей ACK в родных краях, поскольку в 80е еще вовсю жил СССР и вопрос покупки иностранного программного обеспечения был мягко говоря неактуальным.
Теперь подробнее, что там внутри и почему оно до сих пор шевелится представляет интерес:
The ACK contains compilers for ANSI C, K&R C, Pascal, Modula-2, Occam 1, and a primitive Basic. It contains code generators for a large number of architectures, mostly 8 and 16 bit machines; there are also a set of generic optimisation, linker and librarian tools.
В принципе стандартный набор языков для тех лет, но есть нюанс:
It contains assembler and linker support for: 6500, 6800, 6805, 6809, ARM, i80, Z80, Z8000, i86, i386, 68000, 68020, NS32016, S2650, SPARC, VAX, PDP11 and VideoCore IV.
Это уже несет определенный «вау-эффект», причем как для тех, так и для этих лет, поскольку даже для популярных clang и gcc столь широкая поддержка различных архитектур решается весьма нетривиально - путем форков и неофициальных патчей.
В мейнстриме и готовых пакетах столь дикого набора архитектур разумеется нет, при этом поддержку устаревших архитектур еще и регулярно ломают, а некоторые вообще удаляют.
Современная версия ACK, разрабатываемая с 2003 года как открытый проект, поддерживает следующие платформы:
pc86, linux386, linux68k, linuxppc, linuxmips, cpm, rpi (VideoCore IV), pdpv7, msdos86 and msdos386.
Лично у меня глаз начал дергаться после cpm и pdpv7, msdos86 по сравнению с этим уже творческие мелочи.
Для юных читателей, не заставших даже дискет стоит пояснить, что CP/M это операционная система из 1970х, для примерно таких компьютеров:
Sanco 8001. Обратите внимание на ширину дисковода
Как выглядит PDP-7 уже показывал в предыдущей статье, но на всякий случай напомню:
И ACK дает вам возможность скомпилировать приложение в современном окружении в 2025м году, которое будет работать на этом.
Чтобы у вас не сложилось впечатление, будто ACK это только лишь про плешивых дедов пожилых программистов и их древние игрушки, покажу как выглядит заявленный выше VideoCore IV:
Как видите это уже вполне себе современная плата, используемая в различных устройствах.
Отдельно стоит упомянуть историю с Minix — той самой операционной системой, созданной тем самым Таненбаумом для обучения нерадивых студентов сложной теме разработки операционных систем.
В почтовой рассылке, посвященной этой ОС когда-то давно некий Линус Торвальдс впервые представил свой известный проект, вызвавший эпический архитектурный
срачдискурс, ныне являющийся историческим событием.
Дело в том, что ACK когда-то был основным системным компилятором в Minix, при этом являясь коммерческим продуктом — поставлялся в виде готовых бинарников:
The ACK has been used as the standard Minix compiler for years. While the ACK was still commercial, this was done by distributing binaries; when it get opened, a version was forked off and is now used as part of the Minix base build.
Форк с поддержкой Minix мне был не особо интересен, поэтому искать не стал, тем более что в современной Minix 3 используется вполне стандартный clang.
Однако на поддержке столь широкого набора архитектур возможности ACK не заканчиваются и чтобы добить окончательно нежную психику современных разработчиков, процитирую следующий абзац:
Each language comes with its own runtime, so if you’re a C programmer you also get a libc. Compared to gcc, it is far smaller, faster and easier to port.
Стоило догадаться об этом, прочитав список поддерживаемых архитектур и прикинув как оно вообще может работать, но тем не менее.
Так что ACK это уникальный, редкий и необычный проект, позволяющий творить запредельную дичь вроде кросс-компиляции из FreeBSD в MS-DOS подручными средствами, которую вы могли видеть в шапке статьи.
Ниже я опишу процесс сборки и использования этого необычного проекта.
Собирать буду по традиции на FreeBSD 14, поэтому часть требуемых шагов несколько отличается от стандартных.
Проект старый, разработка в git ведется давно, поэтому внутри репозитория присутствует множество разных веток, не актуальных для обывателя.
Чтобы не выкачивать всю эту дичь, я использовал ключ --depth -1, с которым будет выгружена только ветка по-умолчанию:
git clone --depth 1 https://github.com/davidgiven/ack.git
Таким образом собирать мы будем текущую на момент написания статьи версию:
ACK 6.0 is a ground-up reworking of the whole compiler suite, with a lot of the more archaic features removed.
Сборка проекта.. весьма своеобразна, поскольку основана на скриптах Python и немного Lua. Как гласит описание:
The version 5.0 build mechanism has been completely rewritten (twice).
И видимо это еще не конец.
Для сборки нужен достаточно банальный набор инструментов:
любой ANSI C компилятор (автор использовал GCC)
flex и yacc
GNU make (gmake)
Lua с библиотекой lua-posix
Python 3.4 и выше
~2Гб свободного места
В трекере проекта и пул-реквестах есть сообщения от камрадов, использующих ACK на OpenBSD, так что врядли будут проблемы в куда более популярных Linux, Windows и MacOS.
Запускается сборка стандартным образом — вызовом GNU Make в корне проекта:
gmake
Поскольку автор собирал на FreeBSD, которая имеет определенную специфику в именовании инструментов, появится такая ошибка:
Происходит это из-за того, что lua во FreeBSD имеет постфикс версии:
Так что надо отредактировать Makefile в корне проекта и поменять значение переменной LUA=, добавив версию:
Следующая ошибка также специфична для FreeBSD, поскольку gcc у нас тоже с постфиксом версии:
Несмотря на документацию, которая утверждает что актуальный компилятор должен подхватываться через стандартную переменную окружения CC=, нашлось место в скриптах сборки, где были прямо забиты названия используемых бинарников:
Нужный файл называется ack/build/ab.mk и почему-то несмотря на название и расположение — не является генерируемым.
По аналогии с lua, добавляем постфикс версии и сохраняем:
После этого заново запускаем сборку и ждем, никаких других ошибок при сборке замечено не было.
Итоговый размер после завершения сборки, со всеми временными файлами получился размером в 1.7Гб, что несколько больше заявленного в требованиях:
По-умолчанию ACK устанавливается в каталог /opt/pkg/ack, поэтому запускаем из корня проекта:
mkdir -p /opt/pkg/ack
gmake install
Перед установкой будут запущены тесты, но далеко не все:
Итоговый каталог bin выглядит следующим образом:
Хотя основные бинарники находятся в ack/lib/ack:
Теперь переходим к самому интересному — к запуску и работе с ACK, это будет действительно весело.
В репозитории проекта находится каталог examples, где лежат примеры более-менее сложной логики на Си, Паскале и Бейсике, которые точно собираются и работают с помощью ACK.
Один из таких примеров под названием mandelbrot.c , выводящий в консоль с помощью символа * фрактал Мандельброта вы можете лицезреть в работе на заглавной картинке к статье.
Но поскольку мне был интереснее сам процесс компиляции и запуска приложений на разных экзотических архитектурах из древних времен нежели специфика каждой конкретной платформы, не стал заморачиваться сложной логикой, взяв в качестве эталона классический «Hello world!» на Си:
#include <stdio.h>
int main(void)
{
printf("Hello, alex0x08 \n");
return 0;
}
И собственно ниже покажу сборку и запуск этой нестареющей классики под крайне экзотические (по современным меркам) архитектуры.
Компиляцию в COM-файл с последующим запуском можно увидеть на заглавной картинке, поэтому ниже покажу компиляцию в EXE под DOS:
/opt/pkg/ack/bin/ack -mmsdos386 -O hello.c -o hello.exe
Цитируя документацию:
msdos386 produces i386 MS-DOS 32-bit DPMI .EXE files
Поэтому для работы нужен запущенный DPMI-резидент — т. н. «расширитель памяти», который можно взять например тут.
Так это выглядит в записи:
Как видите запуск осуществлялся в известном эмуляторе DOS под названием Dosbox, установленном из пакетов FreeBSD.
Продолжая исторический угар, показываю сборку и запуск под CP/M, напоминаю что это операционная система из 1970х (старше автора) а компьютеры, на которых она работала выглядели так:
Тут надо сделать небольшое отступление и рассказать про эмулятор CP/M, поскольку его в пакетах FreeBSD не нашлось — пришлось собирать руками.
RunCPM - Z80 CP/M emulator
Разработка ведется на Github, забираем исходники:
При сборке будет описанная выше проблема с номером версии в названии исполняемых файлов компилятора GCC — стандартная для FreeBSD, поэтому необходимо в файле RunCPM/Makefile.posix в переменную СС= добавить номер версии:
Сама сборка запускается командой:
gmake posix build
Но это еще не все приключения, после сборки необходимо подготовить рабочее пространство — специальный каталог из которого будет запускаться эмулятор:
mkdir disk
unzip ../../DISK/A0.ZIP
cp ../RunCPM .
В результате появится каталог A/0, внутри которого будут все управляющие команды CP/M, в корне будет запускаемый бинарник самого эмулятора.
Все готово к использованию, для проверки можно запустить эмулятор:
Должна быть отображена шапка с версией и работать команда DIR. Для завершения работы эмулятора введите EXIT.
Теперь можно переходить к сборке тестового приложения.
«Hello world» для CP/M
Для компиляции под эту систему достаточно указать ключ -mcpm:
/opt/pkg/ack/bin/ack -mcpm -O hello.c -o hello.com
Следующим шагом копируем полученный бинарник, обязательно с именем в верхнем регистре:
Запускаем эмулятор и вводим команду hello:
Круто?
Круто, но недостаточно, поскольку среди поддерживаемых ACK систем есть:
pdpv7 produces PDP/11 V7 Unix binaries
Думаю вы догадываетесь, что пройти мимо такого было невозможно, поэтому автор убил еще неделю показываю нечто действительно удивительное.
Чтение этого абзаца прибавляет 100 баллов к инженерным навыкам.
Напоминаю как выглядел PDP-11:
Вот так выполняется компиляция из ACK для этого древнего монстра:
/opt/pkg/ack/bin/ack -mpdpv7 -O hello.c -o hello
Как ни странно и неожиданно, но стандартная утилита file, присутствующая во всех UNIX-системах с незапамятных времен честно показывает тип:
Apout — Simulate PDP-11 Unix a.out binaries
Для проверки я сначала запустил полученный бинарник на этом:
This program is a user-level simulator for UNIX a.out binaries. Binaries for V1, V2, V5, V6, V7, 2.9BSD and 2.11BSD can be run with this simulator. The user-mode PDP-11 instructions are simulated, and TRAP instructions are emulated by calling equivalent native-mode system calls.
Собирается оно под FreeBSD одной командой, поскольку внешних зависимостей нет:
export CC=gcc13
gmake
После сборки в корне проекта появится бинарник apout, так выглядит в работе запуск нашего «Hello world»:
Но разумеется сильно круче было бы попробовать запустить в реальном симуляторе PDP с Unix v7 на борту, что я и сделал.
Эмуляцию PDP как впрочем и множества других исторических систем обеспечивает известный проект Open SIMH. Нужный нам Unix v7 заявлен на главной странице проекта в качестве ключевого примера:
For example Version 7 Unix, released in 1979, runs unchanged today on SimH.
В этот раз эмулятор присутствовал в готовом виде среди пакетов FreeBSD, так что хотя-бы его не пришлось собирать из исходников.
На этот раз.
Забираем готовый образ диска с Unix v7 для PDP-11 отсюда, существует известная инструкция по полной установке с использованием образов установочной ленты:
Но автор решил
не убивать еще неделючто это уже перебор, поэтому использовал готовый образ диска с Unix v7.
В архиве по ссылке будет файл unix_v7_rl.dsk , который необходимо распаковать:
mkdir v7
cd v7
unzip ~/uv7swre.zip
Дальше необходимо создать конфигурационный файл эмулятора:
set cpu u18 set cpu idle attach rl0 unix_v7_rl.dsk attach rl1 hello.tar boot rl0
Сохраните файл как simh-pdp11.ini, в том же самом каталоге v7 , куда был распакован образ диска.
Теперь надо создать tar-файл с собранным бинарником "Hello world" приложения:
cd ~
tar cvf hello.tar hello
cp hello.tar ~/v7/
Итоговый набор файлов должен выглядеть как-то так:
Запускаем эмулятор:
pdp11 simh-pdp11.ini
После появления приглашения в виде символа @ вводим:
boot
Появится древний предок современного Grub, загрузчик:
Вводим:
rl(0,0)rl2unix
Появится приглашение в виде символа # , что означает запуск Unix v7 в однопользовательском режиме:
Нажмите Ctrl - D для начала работы в многопользовательском режиме:
Появится хорошо знакомое любому юниксоиду приглашение авторизации. Введите root в качестве логина и пароля:
При первом запуске будет необходимо выполнить ряд дополнительных шагов. Создаем каталог для временных файлов:
mkdir /tmp
Создаем ссылки на устройства:
cd /dev
make rl
Таким образом со стороны запущенной в эмуляторе Unix v7 будет доступно устройство, эмулирующее ленту и можно будет добраться наконец до собранного на хосте бинарника:
cd /tmp
tar xvf /dev/rrl1
В результате в файловой системе появится тот самый файл hello, собранный на FreeBSD с помощью ACK:
Наконец сам запуск:
Ну кто еще вам спрашивается покажет такую красоту?
ACK имеет отличную портируемость и расширяемость, поэтому существует столь интересный форк этого проекта:
This fork of the Amsterdam Compiler Kit supports the Cray X-MP supercomputer and the COS operating system platform.
Его тоже удалось собрать и запустить, но ввиду невероятной сложности самобытности COS, история будет уже в отдельной статье. Следите за анонсами, как говорится.
Статья была опубликована на Хабре, оригинал как обычно в нашем блоге, все желающие получить обои с автографом (и не умеющие пользоваться нейросетями) должны будут повторить все описанные в статье шаги и прислать скриншот с работающим «Hello <username>» под Unix v7 на PDP, где username — ваш ник.
Получил вчера вот такой интересный спам от китайцев, где меня приняли.. аж за CEO Пикабу!:
Как, откуда, зачем и почему - мне неведомо, честно.
Конечно же к Пикабу я никакого отношения (кроме пользовательского) не имею.
Но "CEO Пикабу" звучит красиво.
Шанс встретить столь крутой проект по реверс-инжинирингу DXHR шарясь по Github конечно мал, но никогда не равен нулю:
Да, это нативная сборка под Linux, причем с фейковым Vulkan API и без железа - используется программный рендер на встроенной видеокарте.
История с исходниками достойна экранизации:
Code here is decompiled with IDA Pro and manually cleaned up, uninlined and rewritten to use templates. It is not a matching decompilation, and there is no workflow to merge the functions here with functions from the binary. The .exe contains class names as part of RTTI (see objtree.txt) but there has been no source leak. There has however been a debug info leak for Tomb Raider (2013). It's a different game, but uses a similar engine.
Можно грузить уровни, модели и персонажей, к сожалению сама игра пока не работает. Но редакция внимательно следит за развитием событий.
Все кто застал 90е или 2000е точно узнают знакомые зеленые очертания ;)
Раскрываю тему всех этих ваших «Junior», «Senior», «Middle» и прочих сказочных персонажей, обитающих в воображении рекрутеров и резюме.
Думаю все кто имеет хоть какое-то отношение к современному ИТ видели плашки «Junior», «Senior» и даже «Middle», которые ныне приделываются к любым должностям и по любому поводу.
Явление стало настолько массовым и популярным, что в ходу даже нетленки вроде Junior Project Manager и Senior Sales Manager.
К сожалению есть проблемы с пониманием смысла, стоящего за подобными плашками, причем как у обывателей так и у самих носителей, поэтому раскрываю тему.
Все началось когда были выкованы мегакольц.. ээ нет, это уже другая история, в нашей все несколько проще:
в начале 90х, когда начался рассвет аутсорсинга и как грибы появлялись первые отечественные компании, целиком сфокусированные на заказной разработке, появилась важная проблема - как презентовать имеющиеся кадры западному заказчику.
Разумеется еще в СССР были «старшие, младшие и ведущие» специалисты, причем такая градация существует и по ныне — в записях трудовой, тогда как все эти «junior/senior/middle» были и остаются только на словах рекрутеров и в резюме.
Проблема заключалась в том, что западные заказчики — основные клиенты отечественных компаний-аутсорсеров до конца 2010х видали в гробу официальную отечественную градацию квалификации и даже научные степени:
лишь в редчайших случаях отечественные профессора котировались на западе и с них не требовали переобучения для подтверждения PhD.
Хотя если говорить откровенно, в аутсорсинге никогда не было особо образованных или настоящих звезд, даже просто сильных разработчиков было мало. Поэтому все известные автору истории создания и развития компаний по заказной разработке начинались с банды голодных студентов, клепающих одноразовую херню в темном подвале за доширак.
Затем эти студенты «кабанели», становились боссами и нанимали уже других студентов, за все тот же доширак.
Но главное, что весь период своего развития такой компании нужно было как-то презентовать свою «банду голодранцев» конечному заказчику. В понятных ему терминах и желательно так, чтобы он в ужасе не сбежал.
Поэтому с самого начала и до сегодняшних непростых дней, разделение на «middle/senior/junior» преподносится также как уровень феи в борделе:
предполагается что с любым уровнем исполнения клиент будет удовлетворен, но в разной степени и за разное время.
Может заказчик прийти к аутсорсеру и набрать себе команду из совсем зеленых джунов по минимальному рейту? Конечно может.
Его вежливо предупредят о последствиях, что «возможно сроки проекта затянутся и будут сложности», но препятствовать не будут. И так поступали очень многие компании-заказчики, даже крупные и известные (привет Adobe и Boeing).
После этапа развития аутсорса, когда все заказчики досыта наелись подобными порочными практиками и заваленными не по одному разу проектами, начался этап создания «внутренней экспертизмы».
Это период примерно с 2007го и до наших дней, в зависимости от страны.
Например у всех отечественных компаний с оборотом от 1 млрд рублей в обязательном порядке появились свои «центры разработки» или хотя-бы отдел с программистами, работающими в подвале штате фултайм.
Ключевые кадры чаще всего цинично переманивали у тех же аутсорсеров, поэтому у большинства нынешних «начальников над программистами» обязательно есть этап карьеры в компаниях-аутсорсерах.
Разумеется, переходя из аутсорсера в условный Сбер народ не парился и тащил с собой и организационные наработки, в том числе модель градации скиллов «junior/middle/senior», которая когда-то была нужна лишь для продажи этих самых скиллов западным заказчикам.
Есть и другая версия, чисто психологическая:
если человека 15 лет подряд называть на каждом совещании «собакой сутулой» — он действительно начнет считать себя таковой.
Поэтому вскоре появились кадры, идентифицирующие себя через такие плашки, человек натурально обозначал себя не как «программист» или «разработчик ПО» а прямо согласно выдуманной должности из резюме.
«Senior UI Architect» — как самый эпичный пример, из виденного лично.
Что разумеется веселило и веселит действительно опытных людей, еще помнящих откуда на самом деле растут уши.
Теперь рассказываю как дела обстоят на самом деле, не на бумаге или в голове у поехавших рекрутеров.
С точки зрения бизнеса, существует всего три варианта квалификации сотрудника:
недостаточная — в сотрудника требуются вложения для обучения и наставничества, без которых он не сможет работать и выполнять должностные обязанности;
достаточная — сотрудник может выполнять обязанности с соблюдением сроков и без дополнительных затрат;
экспертная — сотрудник обладает уникальным опытом и навыками, существенно влияющими на бизнес и его процессы.
Первый вариант это в первую очередь стажеры — учащиеся студенты последних курсов, которые пришли в компанию на практику и еще даже не являются сотрудниками. Сюда же относятся и обучаемые за счет компании, когда человека сначала готовят в течение нескольких месяцев и только потом выводят на работу.
Так поступают например в метрополитене при обучении новых машинистов.
По понятным (здоровому человеку) причинам, готовых к найму и обученных машинистов метро в природе нет и быть не может.
Ко второму варианту относятся собственно обычные сотрудники, c опытом покупаемым за деньги, без редкой специальности или особенных навыков.
Так что как «middle» так и «senior» суть есть самый обычные наемные сотрудники, а вся разница между ними сугубо умозрительная:
кому и кобыла — невеста, кому и вчерашний стажер — сеньор.
Все зависит от мнения, точки зрения и собственного уровня компетенций в каждой конкретной компании. Но вот с реальной экспертизой и экспертами все далеко не так просто и однозначно.
Сейчас будет страшная для некоторых читателей правда, приготовьтесь:
Не бывает непризнанных экспертов.
Непризнанные гении бывают, непризнанные актеры бывают, непризнанные писатели, режиссеры и сценаристы — сколько угодно, все это действительно есть на свете.
Но непризнанных экспертов в какой-либо области быть не может, по определению.
Потому что для достижения экспертного уровня необходимо не просто долго и упорно работать в выбранной области, но еще и постоянно взаимодействовать с другими людьми, задействованными в этой же области. И именно другие люди будут решать являетесь ли конкретно вы экспертом или нет.
Чем больше людей подтвердят вашу экспертизу — тем большим экспертом вы на самом деле являетесь. Если вашу экспертизу не признают — вам просто не станут доверять сложные задачи, а значит вы не сможете расти профессионально.
Так это работает.
Нельзя стать экспертом на однотипных, дешевых и простых проектах, не получится и если постоянно выбирать самые легкие пути и пасовать перед трудностями.
Теперь стоит рассказать о том как происходит подтверждение экспертизы.
В каждой отрасли есть свои устоявшиеся правила, лидеры мнений, профильные журналы и специализированные сайты — грубо говоря любой нефтяник знает поименно все крупные нефтяные компании, историю «Standard Oil» и что такое «гидроразрыв».
Если сможете написать статью для какого-нибудь OGJ, с теоретическими выкладками по оптимизации части процесса добычи нефти — точно привлечете внимание и подтвердите экспертизу.
Десять таких статей и к вам станут обращаться по сложным вопросам.
Сто сложных, объемных публикаций в комплекте с публичными выступлениями на профильных конференциях и вас станут узнавать в отрасли.
Однако не стоит недооценивать сложность подобной работы и требуемые усилия — автор не шутил когда рассказывал, что материал для некоторых из статей собирал по пять лет.
Разумеется любому эксперту обязательно нужна профильная сертификация, в свое время автор также озаботился данным вопросом, получив например такое:
Это далеко не единственный из полученных сертификатов и их наличие в свое время мне неплохо помогло.
Рано или поздно каждый эксперт сталкивается с необходимостью взаимодействия с непрофессионалами — людьми без опыта, профильного образования или даже мозгов.
Чем большим экспертом вы становитесь — тем больше будет таких случаев и с каждым разом ваше влияние на будущее таких «попаданцев» будет расти.
Это означает, что на некотором этапе придется осознать:
по вашей команде «прыгать» неопытный человек действительно может прыгнуть и убиться насмерть.
Именно так часто погибают стартапы — послушав безответственного эксперта, который прикола ради скомандовал «пригнуть с обрыва», навязав например закрытую коммерческую платформу в качестве основы продукта.
Просто для прикола, временами даже без коммерческого смысла и цели.
Абсолютной защиты от такого не существует и если например ваш лечащий врач по какой-то причине захочет вас убить — вы ничего не сможете с этим сделать и сами добровольно выпьете яд, который он вам официально и законно выпишет.
Единственная причина по которой такое не происходит массово — им не до вас профессионалов исчезающе мало и у них огромная куча своей сложной работы. Так что вы до сих пор живы по большому счету лишь потому, что никому особо не нужны и не интересны.
Но переходить дорогу врачам все же не советую ;)
Конечно же везде где есть люди, общество и зависимость от чужого мнения, обязательно появляются и самые разнообразные шарлатаны и жулики. Несмотря на кучу разных вариантов кидалова и развода на деньги, суть шарлатанства с экспертизой одинаковая:
максимально быстро получить «плату за воздух» и быстро убежать, с полным отказом от ответственности
Не буду в сто первый раз упоминать инфоцыган и их платные курсы «успешного успеха», поскольку это крайний (и самый известный) вариант проблемы, который уже успел всем надоесть. Тем более что в жизни бывают куда более тонкие варианты кидалова, связанного с экспертизой, например личная аффилированность с вендором.
Скажу честно:
увы, но я не знаю как решить проблему с жульем, выдающим себя за экспертов.
Слишком много вариантов, слишком много «пограничных случаев» и глобальные проблемы с доверием. Временами недоверяют даже автору, несмотря на все сертификаты, статьи, реализованные проекты и многократно подтвержденный опыт.
Я написал эту статью в надежде, что клиенты поумнеют читатели сделают определенные выводы и в дальнейшем будут с иронией относиться к любым плашкам, как-либо идентифицирующим экспертный уровень.
Тем более если слова «Senior/Middle/Junior/Architect» на серьезных щщах используются для самоидентификации персонажа.
К сожалению проблема с экспертизой и всеми этими "офицерскими погонами" существует далеко не только в ИТ:
вспомнается примечательная серия из «House M.D» (Доктор Хаус), в которой доктор переманил к себе в команду титулованного эксперта аж из ЦРУ без проведения собеседования, а потом горько пожалел, поскольку эксперт оказался недостаточно несмотря на все титулы и погоны.
Да, так тоже бывает и чаще чем вам кажется.
