По пункту 3 очень часто замечал, что архитекторы наархитекторили чего-то без описания и потом не могут сами объяснить как же вкрячить вот это то что надо для этой задачи.
Или архитекторы просто сваливают, не оставив описания какую ж архитектуру они тут нагородили.
Или архитекторы архитектят начитавшись чего-нибудь и решивших применить последнее прочитанное на вот этом проекте сами не до конца понимая всех узких мест.
Electron относительно нишевый, до сих пор из популярных софтин на нем это vs code, slack, postman? Это всё инструменты программистов.
Тяжелые профессионалы так и будут сидеть в нативных 3дмаксах, фотошопах, маях и автокадах и никто это в электрон не переведет.
Казуалы сидят в нативных браузерах и всем всё более лень ставить много аппов если есть какая-то страничка в закладках работающая как вебапп.
Игры нативные декстопные приложения.
Могу согласиться что WPF может быть вытеснен для line of business интранетовых аппликейшнов со временем, но это будет много времени, также как и winforms до сих пор довольно таки живы.
Я один такой кому очень сложно читать это в полном переводе на русский и когда термины пишут в виде нескольких слов с маленькой буквы все слова?
По делу в моих тестах ValueTuple это аналог struct с имплементированными IEquatable/IComparable. Юз кейсы у них соответственно такие же, просто не надо писать эти 10-15 строк кода с объявлением структуры, но за это теряете возможность именовать этот кортеж.
Поэтому я сошелся на том, что для private implementation методов ок, для public будьте добры структуру. Во многом по причине текущего тулинга — прайват методы в одном файле обычно и можно глазами найти что как где используется, find all references же на кортеже не работает, поэтому найти другие зависимые классы будет сложнее. Ну и в целом когда я вижу чужой интерфейс который мне возвращает x,y,z или даже что-нить более бизнесовое типа cost,weight первый возникающий вопрос — что конкретно это сочетание значений значит, где имя структуры/класса?
Ну я не особо сторонник вывешивать это напоказ, чтобы все это обязательно прочитали. Те, кто считают себя неспособными совладать с этой информацией могут не спрашивать.
Но конкретно в ситуациях когда ты приходишь к начальнику по своей инициативе и хочешь узнать зарплаты, чтобы возможно подумать о своем будущем, можешь хотеть узнать зп своего начальника или какого-нибудь старшего программиста, а тебе всеми правдами и не правдами пытаются объяснить, что тебе это знать не надо, то какой остается способ? Идти спрашивать друзей, изучать рынок, собеседоваться в другие места, смотреть что предложат… Хз насколько в этом заинтересовано начальство, для меня это больше похоже на тупость и недальновидность начальства, либо на прямое указание, что начальство тебя использует и хочет подоить как можно дольше пока ты сомневаешься и находишься в неведении.
Никогда не понимал смысла в правиле Лебедева.
Если кому-то реально интересно узнать у кого какая зарплата его продолжит мучать этот интерес. Если ему никто вокруг не будет говорить, то есть вероятность, что человек начнет думать, что например у всех лучше. Либо начнет искать компанию где это не секрет.
Еще это правило исходит из мысли, что люди хотят знать зарплаты конкретных коллег, хотя зачастую среди программеров люди хотят это знать для статистики. Они не рассматривают коллег как конкурентов, а больше смотрят какие есть возможности для них на рынке. Узнавать зп лидов может быть наоборот позитивно, чтобы у человека появилась инициатива развиться в лидов.
Ок, если нет возможности выделить отдельную комнату, то нереально не отвлекаться. Не нужно тогда работать из дома, либо компания может оплатить аренду в каком-нибудь коворкинге в пешей доступности от дома, будет тоже самое что «из дома». Основная проблема офисной работы это время в пути же.
— дома был ребенок, пока не пошел в школу. Постоянно отвлекали эти фиксики, смешарики и другой фон от телевизора. Уйти работать в другую комнату было бессмысленно т.к. за ребенком следовало присматривать и режим его дня отменять не стоило бы. Пришлось совмещать работу и внимание за ребенком.
Этот аргумент ппц странный, но очень часто встречается.
Т.е. пока вы работаете в офисе ребенок дома сам по себе? Или за ним смотрит жена/няня, но переход на «работу из дома» внезапно даёт вам плюху, что можно жену отправить на работу или уволить няню, т.к. «всё равно дома че б за ребенком не присмотреть по совместительству»?
Разница между rock star и дельцом при гуглении в том, что rock star откроет ссылку, оканчивающуюся на .edu, или какой-нибудь научный .pdf и поймет суть формул. Делец же сконцентрируется на поиске куска кода и поиска описания зачем эта формула и как её юзать в прикладных задачах.
1. интерестинг
2. ну это тот же .Select + .Aggregate с несколько большим количеством сахара?
3. по примеру интересно что будет после 21-й строки в abList.Tail.Tail.Head.Equals ( c )
compile error, runtime error?
если abList не меняется, то получается всё же что референсы на элементы abList копируются и abList.Tail != abcList.Tail
т.е. это типичный List where T: class, но не List where T: struct.
Что опять же не отвечает на что такое @ — .Union() (=итератор) или .Union().ToList() (=копии референсов на все элементы обоих списков)
4. да согласен в этом случае, int приводится в decimal автоматически.
1. все же интересно что за особенность — именно из-за этих особенностей как раз кому то кажется что C# «громоздкий» и F# этим лучше.
2. мб, как C# девелопер понятия не имею что такое моноидный тип
3. они мутабл или иммутабл?
если написать
let a (PersonReport)
let b (PersonReport)
let c (PersonReport)
let ab = a+b
let abc = ab+c
что будет в ab.Names?
4. C# не делает преобразований когда ничего не указывается, он возвращает округленный int, когда один из аргументов кастуется в decimal то возвращается decimal. в IL будет разный код для деления интов и деления децималов и будет разный перформанс этих операций.
чтобы было понятнее 1 / 2 это так сказать Int32.Divide(1, 2)
1m / 2 это decimal.Divide(1, 2)
1. это [MethodImpl]? зачем он в этом месте в F#? C# сам это сделает без подсказок в билде с оптимизациями
2. я тоже так подумал, но это ппц такое делать в реальном коде, и уж тем более как пример (для классов типа PersonReport)
3. a.Names b.Names это List, т.е. @ это a.Union(b).ToList() или без ToList()?
4. это сделано чтобы дать hint типу cachedSum чтобы делать деление без округления? C# скомпилится и так и так.
также я не понимаю что значит
1) a.Names @ b.Names
2) x.SalarySum / decimal x.Names.Length
3) Ну и как раз про типы было бы удобно видя примеры сайд бай сайд сравнить что проще.
Я уже давно не задаюсь вопрос «как легко что-либо написать», основные вопросы на нормальном уровне приложений «как легко это будет понять если не трогать это год» «как легко это будет понять другому девелоперу» «как легко это будет поменять».
4) По поводу неявных типов к вашему джисту у меня сразу как у C# девелопера вопросы:
let genericMapReduce toOutput folder src
folder это string или System.IO.DirectoryInfo? как это должен понять девелопер, который читает этот код на гитхабе?
5) каким образом можно понять что в этом примере
let toReport person =
{ Names = [person.Name]
SalarySum = person.Salary }
person это type Person и соотв. F# даёт использовать .Name, .Salary?
6) вот это похоже на то же самое что в C#
Seq.mapi (fun i n ->
{ Name = n; Salary = decimal (i * 100) })
Я так понимаю F# считает что i это int иначе зачем писать decimal(i*100)
Кстати попозже мб попробую написать это в C# 7, с использованием кортежей. Вполне может быть выйдет столько же букв.
Так я этот пост открыл, потому что хотел как C# программист понять как что-то что я знаю будет выглядеть в чем-то что я не знаю.
Я не могу конвертнуть ваши 35 строчек, потому что я не читаю F# даже со словарём и понятия не имею что такое
let inline
или
static member (+) (a, b)
Было бы полезно писать пример на C# рядом, чтобы было с чем сравнить. Раз уж это пособие для разработчиков.
Для меня основная проблема F# я не понимаю что будет внутри в IL и какая будет производительность этого всего + как влепить туда ограничения.
Например тот же пример суммы квадратов, что будет если дать инпут который вернет больше int.MaxValue или long.MaxValue?
например:
let square x = x * x
let sumOfSquares n =
[1..n] // Создадим список с элементами от 1 до n
|> List.map square // Возведем в квадрат каждый элемент
|> List.sum // Просуммируем их!
printfn «Сумма квадратов первых 5 натуральных чисел равна %d» (sumOfSquares 5)
printfn «Сумма квадратов первых 100000000000 натуральных чисел равна %d» (sumOfSquares 100000000000)
что покажет компилятор для типа sumOfSquares?
Ниже ваши же примеры на C# (кроме типов, не могу сейчас это переписать).
Это можно копирнуть как в console app, так и в C#Script .csx если вам хочется ближе к интерпретатору.
int square(int x) => x * x;
int sumOfSquares(int n) =>
Enumerable.Range(1, n) // Создадим список с элементами от 1 до n
.Select(square) // Возведем в квадрат каждый элемент
.Sum(); // Просуммируем их!
void Sample1() =>
Console.WriteLine($«Сумма квадратов первых 5 натуральных чисел равна {sumOfSquares(5)}»);
// 'getMessage' — это функция, и `name` — ее входной параметр.
string getMessage(string name) => name == «Phillip»? «Hello, Phillip!»: «Hello, other person!»;
string phillipMessage => getMessage(«Phillip»); // getMessage, при вызове, является выражением. Его значение связано с именем 'phillipMessage'.
string alfMessage => getMessage(«Alf»); // Это выражение связано с именем 'alfMessage'!
// Создадим список квадратов первых 100 натуральных чисел
List first100Squares => Enumerable.Range(1, 100).Select(x => x * x).ToList();
// То же самое, но массив!
int[] first100SquaresArray => Enumerable.Range(1, 100).Select(x => x * x).ToArray();
// Функция, которая генерирует бесконечную последовательность нечетных чисел
//
// Вызывать вместе с Seq.take!
bool isOdd(int i) => i % 2 != 0;
IEnumerable odds() => Enumerable.Range(1, int.MaxValue).Where(isOdd);
void printfn() => Console.WriteLine($«Первые 3 нечетных числа: [{string.Join(»; ", odds().Take(3))}]");
// Вывод: «Первые 3 нечетных числа: seq [1; 3; 5]
Думаю 25-35 в среднем. Не беру в учёт отличников ВМК МГУ или типа того. В 25 без доп помощи может переехать средний упорный начавший работать близко к фулл-тайм на ранних курса универа.
Стремноватенько переезжать с 2-3к. Так можно только если компания предоплачивает релокейшн и в большом объеме, иначе затраты на оформление визы, билеты, временное проживание, первую аренду и время др первой выплаты от работодателя в 2-3к никак не уложится. А если такой программер которому все оплачивают, то он наверняка в России не на средней зп сидит.
Или архитекторы просто сваливают, не оставив описания какую ж архитектуру они тут нагородили.
Или архитекторы архитектят начитавшись чего-нибудь и решивших применить последнее прочитанное на вот этом проекте сами не до конца понимая всех узких мест.
Тяжелые профессионалы так и будут сидеть в нативных 3дмаксах, фотошопах, маях и автокадах и никто это в электрон не переведет.
Казуалы сидят в нативных браузерах и всем всё более лень ставить много аппов если есть какая-то страничка в закладках работающая как вебапп.
Игры нативные декстопные приложения.
Могу согласиться что WPF может быть вытеснен для line of business интранетовых аппликейшнов со временем, но это будет много времени, также как и winforms до сих пор довольно таки живы.
По делу в моих тестах ValueTuple это аналог struct с имплементированными IEquatable/IComparable. Юз кейсы у них соответственно такие же, просто не надо писать эти 10-15 строк кода с объявлением структуры, но за это теряете возможность именовать этот кортеж.
Поэтому я сошелся на том, что для private implementation методов ок, для public будьте добры структуру. Во многом по причине текущего тулинга — прайват методы в одном файле обычно и можно глазами найти что как где используется, find all references же на кортеже не работает, поэтому найти другие зависимые классы будет сложнее. Ну и в целом когда я вижу чужой интерфейс который мне возвращает x,y,z или даже что-нить более бизнесовое типа cost,weight первый возникающий вопрос — что конкретно это сочетание значений значит, где имя структуры/класса?
Собственно это видно и в коде тут github.com/dotnet/corefx/blob/master/src/System.ValueTuple/src/System/ValueTuple/ValueTuple.cs
Но конкретно в ситуациях когда ты приходишь к начальнику по своей инициативе и хочешь узнать зарплаты, чтобы возможно подумать о своем будущем, можешь хотеть узнать зп своего начальника или какого-нибудь старшего программиста, а тебе всеми правдами и не правдами пытаются объяснить, что тебе это знать не надо, то какой остается способ? Идти спрашивать друзей, изучать рынок, собеседоваться в другие места, смотреть что предложат… Хз насколько в этом заинтересовано начальство, для меня это больше похоже на тупость и недальновидность начальства, либо на прямое указание, что начальство тебя использует и хочет подоить как можно дольше пока ты сомневаешься и находишься в неведении.
Если кому-то реально интересно узнать у кого какая зарплата его продолжит мучать этот интерес. Если ему никто вокруг не будет говорить, то есть вероятность, что человек начнет думать, что например у всех лучше. Либо начнет искать компанию где это не секрет.
Еще это правило исходит из мысли, что люди хотят знать зарплаты конкретных коллег, хотя зачастую среди программеров люди хотят это знать для статистики. Они не рассматривают коллег как конкурентов, а больше смотрят какие есть возможности для них на рынке. Узнавать зп лидов может быть наоборот позитивно, чтобы у человека появилась инициатива развиться в лидов.
Этот аргумент ппц странный, но очень часто встречается.
Т.е. пока вы работаете в офисе ребенок дома сам по себе? Или за ним смотрит жена/няня, но переход на «работу из дома» внезапно даёт вам плюху, что можно жену отправить на работу или уволить няню, т.к. «всё равно дома че б за ребенком не присмотреть по совместительству»?
2. ну это тот же .Select + .Aggregate с несколько большим количеством сахара?
3. по примеру интересно что будет после 21-й строки в
abList.Tail.Tail.Head.Equals ( c )
compile error, runtime error?
если abList не меняется, то получается всё же что референсы на элементы abList копируются и abList.Tail != abcList.Tail
т.е. это типичный List where T: class, но не List where T: struct.
Что опять же не отвечает на что такое @ — .Union() (=итератор) или .Union().ToList() (=копии референсов на все элементы обоих списков)
4. да согласен в этом случае, int приводится в decimal автоматически.
и на классе вместо
public static operator +
будет IEnumerable/IList/T[]/LinkedList Concatenate(...)
смотря что хочется
2. мб, как C# девелопер понятия не имею что такое моноидный тип
3. они мутабл или иммутабл?
если написать
let a (PersonReport)
let b (PersonReport)
let c (PersonReport)
let ab = a+b
let abc = ab+c
что будет в ab.Names?
4. C# не делает преобразований когда ничего не указывается, он возвращает округленный int, когда один из аргументов кастуется в decimal то возвращается decimal. в IL будет разный код для деления интов и деления децималов и будет разный перформанс этих операций.
чтобы было понятнее 1 / 2 это так сказать Int32.Divide(1, 2)
1m / 2 это decimal.Divide(1, 2)
2. я тоже так подумал, но это ппц такое делать в реальном коде, и уж тем более как пример (для классов типа PersonReport)
3. a.Names b.Names это List, т.е. @ это a.Union(b).ToList() или без ToList()?
4. это сделано чтобы дать hint типу cachedSum чтобы делать деление без округления? C# скомпилится и так и так.
1) a.Names @ b.Names
2) x.SalarySum / decimal x.Names.Length
3) Ну и как раз про типы было бы удобно видя примеры сайд бай сайд сравнить что проще.
Я уже давно не задаюсь вопрос «как легко что-либо написать», основные вопросы на нормальном уровне приложений «как легко это будет понять если не трогать это год» «как легко это будет понять другому девелоперу» «как легко это будет поменять».
4) По поводу неявных типов к вашему джисту у меня сразу как у C# девелопера вопросы:
let genericMapReduce toOutput folder src
folder это string или System.IO.DirectoryInfo? как это должен понять девелопер, который читает этот код на гитхабе?
5) каким образом можно понять что в этом примере
let toReport person =
{ Names = [person.Name]
SalarySum = person.Salary }
person это type Person и соотв. F# даёт использовать .Name, .Salary?
6) вот это похоже на то же самое что в C#
Seq.mapi (fun i n ->
{ Name = n; Salary = decimal (i * 100) })
Я так понимаю F# считает что i это int иначе зачем писать decimal(i*100)
Кстати попозже мб попробую написать это в C# 7, с использованием кортежей. Вполне может быть выйдет столько же букв.
т.е. если у меня есть функции
sum a, b => a+b;
deduct a, b => a-b;
то F# скажет
OK sum 1 2
COMPILE ERROR sum int.MaxValue-1 2
OK deduct 2 1
COMPILE ERROR deduct int.MinValue+1 2
Так он это делает?
Я не могу конвертнуть ваши 35 строчек, потому что я не читаю F# даже со словарём и понятия не имею что такое
let inline
или
static member (+) (a, b)
Для меня основная проблема F# я не понимаю что будет внутри в IL и какая будет производительность этого всего + как влепить туда ограничения.
Например тот же пример суммы квадратов, что будет если дать инпут который вернет больше int.MaxValue или long.MaxValue?
например:
let square x = x * x
let sumOfSquares n =
[1..n] // Создадим список с элементами от 1 до n
|> List.map square // Возведем в квадрат каждый элемент
|> List.sum // Просуммируем их!
printfn «Сумма квадратов первых 5 натуральных чисел равна %d» (sumOfSquares 5)
printfn «Сумма квадратов первых 100000000000 натуральных чисел равна %d» (sumOfSquares 100000000000)
что покажет компилятор для типа sumOfSquares?
Ниже ваши же примеры на C# (кроме типов, не могу сейчас это переписать).
Это можно копирнуть как в console app, так и в C#Script .csx если вам хочется ближе к интерпретатору.
int square(int x) => x * x;
int sumOfSquares(int n) =>
Enumerable.Range(1, n) // Создадим список с элементами от 1 до n
.Select(square) // Возведем в квадрат каждый элемент
.Sum(); // Просуммируем их!
void Sample1() =>
Console.WriteLine($«Сумма квадратов первых 5 натуральных чисел равна {sumOfSquares(5)}»);
// 'getMessage' — это функция, и `name` — ее входной параметр.
string getMessage(string name) => name == «Phillip»? «Hello, Phillip!»: «Hello, other person!»;
string phillipMessage => getMessage(«Phillip»); // getMessage, при вызове, является выражением. Его значение связано с именем 'phillipMessage'.
string alfMessage => getMessage(«Alf»); // Это выражение связано с именем 'alfMessage'!
// Создадим список квадратов первых 100 натуральных чисел
List first100Squares => Enumerable.Range(1, 100).Select(x => x * x).ToList();
// То же самое, но массив!
int[] first100SquaresArray => Enumerable.Range(1, 100).Select(x => x * x).ToArray();
// Функция, которая генерирует бесконечную последовательность нечетных чисел
//
// Вызывать вместе с Seq.take!
bool isOdd(int i) => i % 2 != 0;
IEnumerable odds() => Enumerable.Range(1, int.MaxValue).Where(isOdd);
void printfn() => Console.WriteLine($«Первые 3 нечетных числа: [{string.Join(»; ", odds().Take(3))}]");
// Вывод: «Первые 3 нечетных числа: seq [1; 3; 5]
IEnumerable getOddSquares(IEnumerable items) =>
items
.Where(isOdd)
.Select(square);
Ну это совсем узкий случай, при этом мотивация скорее всего не чисто экономическая была, т.к. в Москве той же вцелом не хуже платят разрабам.
Думаю 25-35 в среднем. Не беру в учёт отличников ВМК МГУ или типа того. В 25 без доп помощи может переехать средний упорный начавший работать близко к фулл-тайм на ранних курса универа.
Стремноватенько переезжать с 2-3к. Так можно только если компания предоплачивает релокейшн и в большом объеме, иначе затраты на оформление визы, билеты, временное проживание, первую аренду и время др первой выплаты от работодателя в 2-3к никак не уложится. А если такой программер которому все оплачивают, то он наверняка в России не на средней зп сидит.