Какие зарплаты сейчас у (Senior) PHP-Entwickler?
Есть вакансия для (Senior) PHP-Entwickler, пишут что вроде как можно из Homeoffice работать, и просят сразу написать свои представления о зарплате...
Какие сейчас зарплаты на рынке, сколько реалистично стоит просить? Контора в Мюнхене, если это имеет значение.
Спасибо всем ответившим.
Например, средняя температура по больнице.
https://de.indeed.com/career/php-softwareentwickler/salari...
Мюнхен - очень имеет значение, там всё выше и зарплаты и расходы.
То ли дело махина-Нюрнберг!
Сайт какой то левый и белых сосисок тама нет, как и нормально пива
https://www.tecchannel.de/a/it-gehaelter-in-muenchen-am-ho...
https://www.sueddeutsche.de/karriere/gehalt-staedte-check-...
https://www.stellenanzeigen.de/gehalt-vergleich/softwareen...
https://www.gehalt.de/beruf/php-programmierer-php-programmiererin
от 4392€ до 5499€ в месяц
Плохо... Плохо, что такие отстойные штуки, как джаваскрит и пыха маскируются "хорошением" и добавлением всяких "полномасштабных" фреймворков, вместо того, чтобы сразу написать язык нормально. Создатель языка боится потерять аудиторию, поэтому будет до упора добавлять мёд в бочку дерьма чайными ложками, в надежде, что после ложки так двухтысячной будет уже не так горько. Но мы-то знаем...
Но не всякие языки изначально были задуманы с кучей косяков, ибо были слеплены по-быстрому на коленке, а потом на них стали пытаться строить огромные системы. Жилая многоэтажка из игрушечных кубиков лего.
Как-то уже становится неприлично так мало платить. Приезжает чел с какой-нибудь солнечной Калифорнии, и скупает тут всех с потрохами. По слухам, у них там джун без опыта на меньше сотняжки не идёт, миддл - от двухста, помидоры стоят от трёх сотен, плюс акции, плюс бонусы. А тимлиды многих компаний делают по семь знаков в год.
Куча энтерпрайзных пхп-проектов с миллионами loc говорят, что вы ошибаетесь.
Угу. Плавали, знаем. Переводили один такой "проект" исторически выросший на... блин... забыл как эту CMS звали. не Typo3...
В общем на яву переводили. Измеримый эффект: на том же железе производительность выросла примерно на порядок. А какое счастье было это всё переводить... Энтепрайз, да. Но вот шутка про самокат, она прям в точку :)
P.S. Справедливости ради, в текущем проекте народ на страховке на яве пишет так, что хочется оторвать ручки и запретить подходить к технике сложнее счёт...
Нельзя, они обижаются и жалуются начальству. А начальство просит не давить, а то один после беседы со мной "заболел" на две недели. При том что я с ними предельно корректен. Сильнее "а почему ты тут сделал так?" не давлю. Страховка, они там так привыкли. 2-3 молодых разработчика есть, которым ещё можно что-то объяснять, остальные... Жуткое коболисткое болото.
А можете вкратце рассказать, что может актуальный ПХП?
1. Появился match - см. https://www.php.net/manual/ru/control-structures.match.php
2. Безопасный null (используется знак "?") - см. https://sergeymukhin.com/blog/php-8-operator-nullsafe
3. Объявление типы данных в функциях и методах см. - https://www.php.net/manual/ru/language.types.declarations.php
4. Аннотации - https://www.php.net/manual/ru/language.attributes.overview.php
5. Goto (относительно новая) см. - https://www.php.net/manual/ru/control-structures.goto.php
6. PDO (относительно новая, что-то типа ADO) см. - https://snipp.ru/php/manual-pdo
P.S.:
1. Есть куча фреймворков для PHP - Yii Framework, Prado Framework, Kohana Framework, Laravel, Symfony, Zend Framework, итд.
2. Мне лично нравится сериализация в PHP см. пример:
<?php class Person { private $firstname; private $lastname; private $birthday; public function __construct($firstname, $lastname, $birthday) { $this->firstname = $firstname; $this->lastname = $lastname; $this->birthday = $birthday; } public function set_firstname($firstname) { $this->firstname = $firstname; } public function set_lastname($lastname) { $this->lastname = $lastname; } public function set_birthday($birthday) { $this->birthday = $birthday; } public function get_firstname() { return $firstname; } public function get_lastname() { return $lastname; } public function get_birthday() { return $birthday; } public function tostring() { return $firstname . ' ' . $lastname . ' ' . $birthday; } } $p = new Person('Anton', 'Mustermann', '01-01-1980'); $p2 = new Person('Anna', 'Musterfrau', '02-05-1982'); echo serialize($p); echo ' '; echo serialize($p2); ?>
Результат (сериализованный объекто можно сохранить в БД, в файл, в сессию, и десериализовать):
O:6:"Person":3:{s:17:"Personfirstname";s:5:"Anton";s:16:"Personlastname";s:10:"Mustermann";s:16:"Personbirthday";s:10:"01-01-1980";} O:6:"Person":3:{s:17:"Personfirstname";s:4:"Anna";s:16:"Personlastname";s:10:"Musterfrau";s:16:"Personbirthday";s:10:"02-05-1982";}
3. Простое логгирование в PHP см. пример:
<?php ini_set('log_errors', 1); ini_set('error_log', 'error.log'); ob_start(); $bv. error_log(ob_get_clean()); ?>
Результат:
[24-Jul-2022 22:48:23 Europe/Berlin] [24-Jul-2022 22:48:23 Europe/Berlin] PHP Notice: Undefined variable: bv in C:\xampp\htdocs\code\err.php on line 6
А написать "правильно" и спросить "почему тут плохо?"
Пф... Щаз.
1. Никакой разницы тут нет, это вкусовщина, мы привыкли делать так.
2. Шееееееф! У меня времени нет тикеты делать, а он ко мне докапывается и странного хочет!
А когда спрашиваешь "почему сделал так", так просто отбиться не получается. На любое "у меня нет времени" и жалобу - поясняю что мне надо править баг и он может быть в этом куске, но я не понимаю почему тут сделано так. Бурчат, воняют, но пояснять приходится. А в процесс пояснений можно воткнуть свою мысль. В качестве пояснения "почему мне тут было плохо понятно".
Самых ярых коболистов я не трогаю. Они дальше копи-пейста и поправить + на - не заходят...
Суть не в том, что пхп-дотнет лучше/хуже
а в том, что пишут на том, что знают, и переучиваться особо не хотят. Только мало кто себе в этом признаётся.
Одно дело знать нормальный язык и не хотеть переучиваться на дерьмовый (типа Дотнет - Джаваскрипт или Пых), и другое дело - наоборот.
Ну, ява в 2008 тоже не такая шустрая была. Там больше выигрыш был от очистки всего от накопившихся слоёв правок. Когда никто не понимает что он делает, но пишет своё дополнение. Одно и то же, то в файл, то в БД, то вообще хттп запрос. И чтоб быть "уверенным" а забабахаем-ка всюду! 3 раза одно и тоже в 3 места писали. Для надёжности. Ну и когда разницу между set-ом и листом не понимают, легко из O(n^2) в О(logn) переписать.
А так, после того как в пыхыпы добавили goto, я на проекты с ним не подписываюсь. Мне боязно :)
<?php class Person { private $firstname; private $lastname; private $birthday; public function __construct($firstname, $lastname, $birthday) { $this->firstname = $firstname; $this->lastname = $lastname; $this->birthday = $birthday; } public function set_firstname($firstname) { $this->firstname = $firstname; }
Какой-то плохой Blazor получился. Пыха конечно была раньше, но в том-то и дело, что плохой язык просто обмазывали свистелками и перделками.
А как выглядит проект на пыхе из сотен классов? И как его код миксуется с разметкой?
Я ни разу не видел гото в своем проекте.
не хочу даже теоретической возможности его снова увидеть, хватит мне миграции с фортрана :)
я сейчас участвую в клинкод-проекте для фаувэ, коллеги оттуда очень серьезно к этому относятся.
Да ладно? "Дас ауто" начали что-то адекватное в ИТ делать? У меня пока что информация о них такая: "набирают ИТшников, но не знают что им от них надо. Сидят, бездельничают на митингах. Молодёжь быстро сваливает"
Беги, беги оттуда! 😁
это у меня как "вызов принят" проходит. Если получится в этом болоте что-то изменить... Тогда я всё смогу! :) Ну а если за два года ничего не изменится, свалю. Деньги платят хорошие, но уж больно противно код смотреть...
Фортран хорош для определенных задач, как и Кобол, зачем с него портировать? :-)
С фортрана переписывали потому что это был единственный блок (целочисленные операции с матрицами), который использовался в бооольшой системе. И он работал на S/390, а голубые его прикрыли. Миграция на новую платформу, да.
А зачем с кобола портировать... Потому что мы говорим кобол, понимаем zOs. А оно не только умерло и воняет, голубые забили на платформу болт уже лет 15 как, только цены повышают, не только фиг найдёшь кого-то кто в ней разбирается, даже молодёжь, готовую не неё обучиться - тоже не найдёшь. В результате всё, что на коболе сейчас работает, живёт только благодаря ещё не ушедшим на пенсию 50+ летним коболистам. И когда они уйдут - всё, тушите
свет, сливайте воду. Всем системам капец. К 2030 платформа (наконец-то!) умрёт окончательно (надеюсь). А кобол на других системах... Не имеет смысла. 1:1 с хоста не смигрируешь, надо переписывать. Или громоздить эмуляторы. Которые тоже хреноватенько работают. И получается что хочешь жить - переписывай.
Я сам дерьмо не пробовал, но многие другие говорят, что невкусно. А я верю! )))
Как и в то, что и из дерьма можно сделать конфетку - ну т.е. написать на Пыхе большую систему, которая будет как-то работать. Просто нужно добавить на ложку дерьма тонну патоки, шоколада и мёда (т.е. обмазаться кучей фреймворков, которые правят недостатки Пыхи) - там оно и растворится.
А как выглядит проект на пыхе из сотен классов?
Обычно можно сделать маленькие PHP файлы, которые можно вызвать по AJAX.
Пример поиск песен, который вызывается по AJAX:
<?php require_once('./config/config.php'); require_once('./libs/core/mod_core.php'); require_once('./libs/core/mod_database.php'); require_once('./libs/core/mod_audio.php'); session_start(); if(!isset($_SESSION['UserID'])) exit; header('Content-Type: application/json'); $arr_files = array(); $arr_files = audio_find('%' . @$_POST['title'] . '%', 0, 10000); die(json_encode($arr_files)); ?>
И как его код миксуется с разметкой?
Пример MVC:
index.php:
<?php require_once('./controller/MainController.php'); // Подключаем контроллер MainController.php $mc = new MainController; // Объект mc - MainController // Если action не существует, или action пустой, то $str_action по умолчанию будет index if(!isset($_REQUEST['action']) || is_null($_REQUEST['action'])) $str_action = 'index'; else $str_action = $_REQUEST['action']; // Иначе считываем action // Обработка action switch($str_action) { case 'index': echo $mc->action_index(); // Если action = index, то вызываем метод из MainController action_index(), и отображаем break; } ?>
Контроллер MainController.php:
<?php require_once('./model/main.php'); function show($filename, $values = NULL) { ob_start(); if(isset($values)) extract($values); include($filename); return ob_get_clean(); } class MainController { public function action_index() { $mm = new MainModel; // Объявляем MainModel $str_view = show('./view/home.php', array('person' => $mm->get_items())); return show('./view/template.php', array('title' => 'Home', 'content' => $str_view)); } } ?>
Модель MainModel.php:
<?php class MainModel { private $arr_items; public function __construct() { $this->arr_items = array('firstname' => 'Anton', 'lastname' => 'Popov', 'gender' => 'M', 'birthday' => '01.05.1980'); } public function get_items() { return $this->arr_items; } } ?>
Шаблон template.php:
<html> <head> <title><?=$title; ?></title> </head> <body> <?=$content; ?> </body> </html>
Вьюшка home.php
<h1>Home</h1> <?php foreach($person as $k => $v): ?> <div><?=$k; ?>=<?=$v; ?></div> <?php endforeach; ?> </table>
Обычно можно сделать маленькие PHP файлы, которые можно вызвать по AJAX.
Пример поиск песен, который вызывается по AJAX:
разве эти все Require once не на сервере обрабатываются? Какой там аякс?
<?php require_once('./config/config.php'); require_once('./libs/core/mod_core.php'); require_once('./libs/core/mod_database.php'); require_once('./libs/core/mod_audio.php'); session_start(); if(!isset($_SESSION['UserID'])) exit; header('Content-Type: application/json'); $arr_files = array(); $arr_files = audio_find('%' . @$_POST['title'] . '%', 0, 10000); die(json_encode($arr_files)); ?>
<?=$title; ?>
Не, зря я с Blazor-Razor сравнил - это скорее древнючий ASP.NET без MVC:
<%#...%>
Но и то в последние версии ASP.NET добавили Razor-синтаксис, где всё через один символ @ вставляется.
Блин, да там ещё хуже - мало такого синтаксиса <?=...?>, так ещё и $ добавлен. В результате - куча закорючек, за которыми кода не видно. Я бы уже за одно это выкинул эту Пыху в помойку. Тут вам не там - в смысле, что не 20 лет назад, когда народ позволял над собой измываться крючкотворством.
не хотеть переучиваться на дерьмовый
Это всё разделение чисто индивидуально. И дело не только в конкретном языке, а в "системе" (IDE, либы и пр.)
Зная хорошо один язык, начать писать что то на другом вопрос достаточно короткого времени. Но вот узнать все нюансы - уже достаточно долго.
require_once
Content-Type
А вот эти все чёрточки и подчёркивания в соединениях слов для элементов языка - это тоже обязательно, или просто автор кода так захотел?
require_once - это так решил разработчик PHP.
Content-Type - это так решил имхо W3C см. https://www.w3.org/Protocols/rfc1341/4_Content-Type.html. В Content-Type указываешь тип MIME, если jpeg картинка то пишишь Content-Type:image/jpeg, если XML то Content-Type:application/xml, итд., тут перечислены MIME - https://developer.mozilla.org/ru/docs/Web/HTTP/Basics_of_H...
А вот эти все чёрточки и подчёркивания в соединениях слов для элементов языка - это тоже обязательно
Если не ООП то имя функции могут выглядеть так:
имямодуля_глагол_существительное
имямодуля_глагол_глагол
Например:
function user_add_new_user($str_username, $str_password) { ... } function user_delete_user($int_user_id) { ... }
Типы данных выглядят так:
типданных_имяпеременной
типданных_глагол_существительное
типданных_глагол_глагол
Например:
$str_username = 'uscheswoi_82'; // Строка $int_age = 40; // Число $bool_is_married = false; // boolean
разве эти все Require once не на сервере обрабатываются? Какой там аякс?
Так вызывается:
function ap_lsf(u, tr_uploaded) // load_sound_files { $$.ajax(path + "mp3soundsload.php", 'POST', 'u=' + u, function(sounds) { var resp = JSON.parse(sounds); var items = ''; for(var index=0; index<resp.length; index++) { items += '<div id="player__' + resp[index].audioid + '"><div title="' + sprintf(tr_uploaded, resp[index].flname) +'" id="player_' + index + '"><div>' + resp[index].author + ' - ' + resp[index].title + '</div><table><tr><td><div id="play_button_' + index + '"><a class="player_button" href="javascript:void(0);" onclick="ap_pa(\'' + resp[index].file + '\', \'\',' + index + ', \'' + resp[index].author + ' - ' + resp[index].title + '\')"><img id="img_' + resp[index].audioid + '" src="' + path + 'images/play.png" width="20px" height="20px" /></a> </td><td class="" style="width:200px;"><div class="_auplayer_none"> </div><div class="_auplayer_pos" style="width:0px;" id="progress_' + index + '"> </div></td><td><span id="current_time_' + index + '">00:00</span> / <span id="time_' + index + '">' + resp[index].length + '</span></td><td><a class="command" href="#javascript:void(0);" onclick="ap_da(' + resp[index].audioid + ');">×</a></tr></table></div></div>'; } var items2 = '<div id="volume_inner"><a class="command" href="javascript:void(0);" onclick="ap_dec();">-</a> <input type="text" id="volume_value" value="0.5" style="text-align:center; width:50px;" disabled> <a class="command" href="javascript:void(0);" onclick="ap_inc();">+</a></div>'; $('volume').text(items2); $('sounds').text(items); }); }
Я имел ввиду, что эти змеи и кебабы - они встроены на уровне языка и нужно только так (например, верблюд не подойдёт), или просто так решил автор кода, а писать на Пыхе можно как угодно?
https://en.wikipedia.org/wiki/Letter_case#Use_within_progr...
Вот тут вроде пишут, что можно по-нормальному называть.
А как выглядит проект на пыхе из сотен классов?
-----
Правильнее было бы поинтересоваться кто из сотен тысяч пыхапистов знает что такое класс...
Это как у тебя - тебе сказано что для решения определенной задачи надо знать пропсы и таргетсы... и чо? Изучил? Не-а... будешь дальше ныть что такое сделать не знсешь как...
У меня - получалось... если кода оставалось 30-40%...
С этими коболистами без шансов. Наилучшая реакция - ага, спасибо, копипаста твоего предложения и... через пару дней коммитим такой же самый код, который только что поправили.
А вот это никогда не работало.
Неоднократно получалось так донести свою мысль. Так что работает.
Да и по психологии обучения не должно - заинтересованность на уровне "от... вянь"...
С чего же это не должно? До тех, у кого заинтересованности нет, никак без административных кнутов не достучишься. А кого-то можно и заинтересовать. Если он соблаговолит тебя послушать.
Так что работает.
-----
"через пару дней коммитим такой же самый код,"
А кого-то можно и заинтересовать.
-----
10^(-10).
Ты же сам говоришь - нет никакой заинтересованности. Изначально - нет.
Чтобы заинтересовать - надо показать как предлагаемое облегчит(уменьшит) выполняемую работу.
Словеса... и, особенно, требуемое после них умственное усилие для осознания и закрепления - не способствуют.
встроенные функции с подчёркиванием, вызываете с подчёркиванием (допустим $_GET, $_POST, utf8_encode, utf8_decode, str_replace, require_once, json_encode, json_decode, ob_clean, ob_start, итд.), а если кастомные функции, то сами придумываете как вам лучше, в колледже на заставляли так - типданных_имя_переменной, имямодуля_функция(...).
"через пару дней коммитим такой же самый код,"
Аккуратнее в полемическом задоре. Не путаем. Это был результат "А написать "правильно" и спросить "почему тут плохо?" а не "спросить почему сделано так".
Ты же сам говоришь - нет никакой заинтересованности. Изначально - нет.
Чтобы заинтересовать - надо показать как предлагаемое облегчит(уменьшит) выполняемую работу.
Изначально нет. Всех кто чем-то интересуется коболоидные дебилозавры всеми силами выживают. И делают круглые глазки когда из спрашиваешь зачем они молодёжь отпугивают. Ниценемизм очень развит.
Чтобы заинтересовать - недо для начала добиться что предлагаемое будет вообще рассмотрено. А не скопипащено на "отвали". И вот чтобы начать разговор и нужен вопрос "а почему тут так". И предлагать решение только после того, как будет понята проблема.
встроенные функции с подчёркиванием, вызываете с подчёркиванием (допустим $_GET, $_POST, utf8_encode, utf8_decode, str_replace, require_once, json_encode, json_decode, ob_clean, ob_start, итд.), а если кастомные функции, то сами придумываете как вам лучше, в колледже на заставляли так - типданных_имя_переменной, имямодуля_функция(...).
Если это действительно так, то ой.
В чём проблема, если бы создатели новых модных молодёжных языков (ну, в то время это было так) просто копировали бы удачный синтаксис, немного его исправляя, вместо того, чтобы городить что-то радикально своё - странное и неудобное?
как будет понята проблема.
-----
Так проблемы - нет - работает (же)!
добиться что предлагаемое будет вообще рассмотрено. А не скопипащено на "отвали".
-----
Оно, если понимание этого "оно" превышает некий и не очень высокий уровень затрат,
не будет не то что рассмотрено - оно даже скопипащено не будет.
А уровень приемлемых затрат ой как не высок... для выживающих в кодинге юниоров
где-то на уровне 30-40 минут самостоятельного изучения... у долбоящеров, типа меня,
может быть от нуля до пары недель... а за пару недель коболиста на интерфейсы не
переведешь... у них скорее всего полный ноль на все что не кобол...
При этом в PHP есть родной autoloader, то бишь более очевидным (и более быстроработающим) решением была бы установка посторонних пакетов таким образом, чтобы заюзать встроенный autoloader. 🤦🏻 и там все PSRы такие.
Что за родной autoloader? Ни разу не видел его упоминания.
Этот? https://www.php.net/manual/en/function.spl-autoload.php
Дано: index.php в PROJECT_ROOT.'/public'. Классы с полным путём имени в PROJECT_ROOT.'/src'. Тогда следующий код в index.php регистрирует дефолтный autoloader, для которого не нужен дополнительный код.
ini_set('include_path', realpath('../src')); spl_autoload_register();
То бишь можно было бы модифицировать Composer, сократить количество кода, увеличить скорость работы приложения, но нет...
Можно, но зачем добавлять лишний код? Он не только медленнее, он расходует память, мешается в трейсах и дебаге, и так далее. Всё что этот PSR-4 даёт по сравнению со встроенным — это засунуть код в vendor-папку с неканоничными путями.