Франкенштајн у програмирању је код састављен од некомпатибилних делова различитих технологија, стилова и архитектура. Према истраживању ThoughtWorks Technology Radar (2024), 28% великих пројеката садржи знакове синдрома Франкенштајна — архитектурног еклектицизма који настаје у одсуству јединствене техничке визије. По аналогији са романом Мери Шели, такав код ради, али његово одржавање постаје кошмар.
Главно
Франкенштајн (Frankenstein code, Frankenstein pattern) — антиобразац где се програмски систем саставља од делова који нису намењени за заједнички рад. Као чудовиште Франкенштајна, такав код може да функционише, али је ружан, непредвидив и опасан при најмањим променама.
Термин потиче из књижевности: у роману Мери Шели "Франкенштајн, или савремени Прометеј" (1818) научник је створио живо биће од делова тела различитих преминулих особа.
Разлика између Франкенштајна и шпагети кода је у обиму и природи проблема.
Микросервисна архитектура дозвољава употребу различитих технологија за различите сервисе, али под условом јасних граница и стандардизованих протокола.
Недостатак техничког лидера или архитекте — први узрок.
Спајање пројеката — други чест узрок.
Корпоративна преузимања — трећи сценарио.
| Узрок | Опис | Резултат |
|---|---|---|
| Нема архитекте | Сваки програмер бира свој стек | 3 различита HTTP клијента |
| Спајање пројеката | Два производа се лепе у један | Два ORM-а, два начина логовања |
| M&A | Преузимање предузећа | Хибрид архитектура и стилова |
| Експерименти | Нове технологије без стратегије | Java 8 + Java 21 у једном фајлу |
| Политичке одлуке | Наметање технологије одозго | Enterprise фрејмворк за скрипт |
Искусни програмери који желе да испробају нове технологије у производњи често постају извор Франкенштајна.
Класичан пример — коришћење више ORM-ова у једној апликацији.
Други пример — мешање архитектурних стилова.
Трећи пример — технолошки стек са Python, Node.js, C# и Java.
// франкенштајн — мешани стилови и технологије
// callbacks, Promises и async/await комбиновани
// callbacks
db.query("SELECT * FROM users", function(err, rows) {
if (err) handleError(err);
// Promise унутар callback
fetch("/api/data").then(function(data) {
// async/await унутар then
(async () => {
const result = await processData(data);
sendResponse(result);
})();
});
});
// чист код — уједначен async/await стил
async function getUserData(userId) {
const user = await db.query("SELECT * FROM users WHERE id = ?", [userId]);
const data = await fetch("/api/data/" + userId);
return await processData(user, data);
}
Једна база података користи се истовремено и као SQL и као NoSQL.
Тешкоћа онбординга — прва последица.
Непредвидивост понашања — друга последица.
Безбедност — трећа последица.
SonarQube може измерити технички дуг, али не и "архитектурни дуг".
Први корак — поставити архитекту или tech lead-а.
Други — увести процес Architecture Decision Record (ADR).
Трећи — принцип "један задатак — један алат".
Експерименти су дозвољени, али у изолованом окружењу.
Инвентаризација — први корак.
Стандардизација — други корак.
Стратегија Parallel Run — трећи корак.
// франкенштајн — три HTTP приступа у једном пројекту
// Модул A: OkHttp
OkHttpClient client = new OkHttpClient().newCall(request);
// Модул B: RestTemplate (Spring)
restTemplate.getForObject(url, String.class);
// Модул C: java.net.HttpURLConnection
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
// ујединачен приступ: RestTemplate за синхроно, WebClient за реактивно
@Autowired
private RestTemplate restTemplate;
public String callApi(String url) {
return restTemplate.getForObject(url, String.class);
}
Технички лидер — главни алат за борбу против Франкенштајна.
Најважнији квалитет архитектуре је доследност (consistency).
Често постављана питања
Polyglot persistence — свесно коришћење различитих база података за различите задатке.
Да, и то је чест проблем.
Не забрањујте — усмеравајте.
Прво инвентаризација, па стандардизација.
Што мање, то боље.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође