пятница, 10 декабря 2010 г.

.NET программист ищет работу. Собеседование. Вопросы на собеседовании. Часть №1.

Некоторое время тому назад стал вопрос о трудоустройстве, так как я практически отучился на программиста и мне нравится процесс программирования, то решил искать работу, связанную с данной тематикой.  Для программиста не секрет, что для того чтобы попасть на работу в более или менее крупную компанию по разработке программного обеспечения необходимо пройти собеседование.

И вот резюме составлено, и отправлено в 15-20 компаний. Что следует уточнить, ищу работу я .Net программиста, без особых направлений в технологиях. Большинство компаний в данном направлении занимаются веб-разработкой, и поэтому как правило необходимо знать ASP.Net. За плечами было пару средненьких веб-сайтов, но с теорией, как выяснилось далее всё таки были проблемы. А, и ещё один камень в мой огород, английский. С ним я даже не на Вы: словарный запас маленький, говорить, писать об этом речи даже не идёт.

И вот через пару дней со мной связались по скайпу и пригласили на собеседование. Оттянув дату собеседования на четыре дня, приступил к «зубрёжке»  ранее изученного материала. В эти четыре дня мне позвонили ещё с одной компании и поинтересовались: заинтересован ли я в выполнении тестового задания, на что мною был дан положительный ответ, и тестовое задание было получено. Его выполнение было мною отложено до дня собеседования в первой компании, ну что бы так сказать «не разрываться» между двух огней.

Собеседование.

Встретил меня HR-менеджер компании. Сразу были, вопросы: Почему начал искать работу? Сколько захочешь денег через год? Почему остановился на .Net, может интересна Java? Ну, и вопрос, который, как мне кажется, определил результат собеседования: «Как с английским языком?». На него я честно ответил, что практически не знаю, что, как мне кажется, очень огорчило менеджера. Он рассказал, что в компании с английским очень строго, и чем лучше знаешь, тем больший тебе респект.

Далее в комнату пришёл мужчина лет 30, представился прожект менеджером. Сказал, что будет меня собеседовать технически. Hr-менеджер ушёл.  Ну, и тут, стали спрашивать, то, что должен знать .net программист при трудоустройстве на работу.

ООП:

1. На каких принципах построено ООП?
2. Что такое инкапсуляция?
3. Что такое делегаты и события?
4. Свойства. Создать свойство доступное для записи (set) только наследнику, для чтения (get) всем объектам класса.

SQl (в частности, t-sql):

1. Inner Join, left join, right join… Какие ещё join знаешь? Какой, что делает?
2. Даны две таблицы. Сделать выборку с таблиц по FK с помощью Join, содержимое одного из полей, которых начинается с «А» (оператор LIke).
3. Написать этот же запрос на linq (linq to SQL).

ASP.Net:

1. Объекты Cache, Application, Session… На каком этапе работы приложения создаются, инициализируются… Тут были необходимы, как мне кажется, глубокие теоретические знания, которых у меня не было.
2. Вопросы по Session. Если открыт браузер один, и мы откроем ещё один и зайдём на этот же сайт, что будет с сессией? (Новая или одна сессия на два браузера?) Откроем вкладку в браузере, что будет с сессией? Сервер работает нестабильно, часто перезагружается, как не потерять посетителей? (Хранить сессию в базе.)

Вроде, это всё что спрашивали! На всё кроме первого вопроса в категории asp, я отвечал довольно уверенно. Со мной, попрощались, и обещали сообщить о результатах собеседования. Через день, я сам связался по скайпу с HR-менеджером, спросил, как мои дела? Но какой-то там начальник, ещё не решил, нужен ли я их компании. А через пару дней, они мне сами отписали и сообщили, что пока они не могут мне предложить работу.

Но, это был ещё не конец, я сделал тестовое задание, от второй компании, и был приглашён на собеседование к ним. О тестовом задании и о собеседовании во второй статье на данную тему.

понедельник, 8 ноября 2010 г.

Решение задачи линейного программирования симплекс методом.

Недавно столкнулся с проблемой решения задачи симплекс методом. После долгих поисков толкового алгоритма решения данным методом – конкретных результатов получено не было. В ходе самостоятельных рассуждений симплекс метод был побеждён.
В данном посте я постараюсь без воды, научить вас решать задачи такого вот плана:
На каждом шаге решения нам необходимо будет заполнять таблицу следующего вида:
Ну, что же, начнём заполнение таблицы решения. В первую строку нашей таблицы запишем индексы целевой функции, а в столбцы x1, x2, x3, x4, x5, x6 индексы функций объединённых в систему. В столбце RHS разместим результаты функций.
Теперь самое интересное в решении симплекс-методом, среди столбцов данной таблицы есть единичная матрица. Кто из математики забыл, напомню, единичной матрицей называют такую матрицу, у которой диагональ состоит из единиц, а все остальные элементы равны нулю. На фото снизу я выделил столбцы, которые образуют единичную матрицу:
Шаг 1.  Теперь индексы, находящиеся в строке один, перед единицами в единичной матрицы, заносятся в столбец CB, а название столбцов с элементами равными один в единичной матрицы становятся в первый пустой столбец нашей таблицы:

Шаг 2. Далее нам необходимо заполнить строку Zj, делается это следующим образом: элементы, находящиеся в столбце CB, умножаются на элементы столбцов x1, x2, x3, x4, x5, x6 и слаживаются между собой. Сказанное выше можно увидеть на фото ниже:
Шаг 3. В конце каждой итерации необходимо высчитать Cj-Zj, в этом нет ничего сложного, здесь простое вычитание из первой строки последней строки. В конечном итоге таблица выглядит следующим образом:
Шаг 4. Если мы видим в строке Cj-Zj есть положительные элементы, то нам необходимо продолжать решение симплекс методом.
В строке Cj-Zj находим наибольшее число, как мы видим - это восемь, следовательно, столбец номер два с восьмёркой становится ведущим столбцом, выделим его жёлтым цветом:
Шаг 5. Теперь необходимо найти ведущую строку, делается это следующим образом: элементы столбца RHS делятся на элементы ведущего столбца. После деления из -6 (12/-2), 3 (12/4) и 5 (25/5) выбирается минимально положительный элемент, в данном случае 3, и таким образом, строка, в которой он получился -  становится ведущей строкой. Выделим её жёлтым цветом:
Шаг 6. Возвращаемся в самое начало, к практически пустой таблице (за исключением строки один, Cj – она во всех таблицах не подлежит изменениям):

Как вы понимаете новую таблицу, мы должны  заполнить, исходя из предыдущих расчётов. Ну, что же начнём с первой строки. Делим ведущую строку на элемент, получившийся на пересечении ведущей строки и ведущего столбца, в нашем случае на 4:
Далее самое сложное, на месте других элементов, находящихся в ведущем столбце, мы должны получить нули в новой, строящейся таблице. Это можно представить в виде следующей формулы: (элемент в ведущем столбце)-(x*элемент в первой строке, новой таблицы)=0.
В нашем случае, X для первой строки (старой таблицы)  равен: -2-(x*1)=0, т.е. x=-2. Умножаем первую строку в новой таблице на -2 и отнимаем от первой строки (старой таблицы).
В нашем случае, X для третей строки (старой таблицы) равен: 5-(x*1)=0, т.е. x=5. Умножаем первую строку в новой таблице на 5 и отнимаем от третей строки (старой таблицы).
Ну, вот собственно, алгоритм я вам рассказал, теперь идёт повторение Шагов, описанных выше, начиная с первого. 

Мною же далее была получена следующая таблица:

В строке Cj-Zj есть положительные элементы, следовательно, я строю следующую таблицу:
Ну, собственно конец наших расчётов и мучений, в последней строке нет положительных элементов, следовательно функция находится в максимуме равном 39, при X4=1, X2=4, X1=23.



Первый пост. Начало.

Здравствуйте, многоуважаемые читатели, моего блога. Не знаю почему-то, но захотелось найти место в таком большом интернете, в котором я смогу делится с вами своими удачами и успехами в области программирования (неудачи и промахи,  я исключаю сразу).

Цели блога:
  1. Прибыль. Да-да, я не очень верю во всякую, там ерунду типа "вселенское добро", и поэтому я постараюсь заработать на этом всём деньги. Монетизация будет построена на, так называемых, платных архивах. Как мне это видится сейчас, я буду стараться в свободное от работы (которой у меня сейчас нет) и учёбы (которая подходит к завершению) реализовывать алгоритмы и программное обеспечение на си шарпе и выкладывать их в запакованном виде.
  2. Дневник удач. Буду, наверняка, описывать трудности, с которыми приходится сталкиваться  во время программирования и моё решение в таких ситуациях. Возможно, в блоге будут заметки и свободные переводы статей зарубежных авторов (с английским, я на Вы, поэтому и свободный перевод), для индексации и привлечения как можно большего количества людей в блог.
  3. Самоконтроль и саморазвитие. Постараюсь писать 4-5 постов в неделю, поэтому придётся достаточно много заниматься программированием, что бы было о чём писать. Буду себя заставлять планировать своё время, что бы исключить промежутки времени, когда я отдыхаю и нечего полезного не делаю.

Ну, наверное, и всё пока что. Ах, да! Блог будет рассчитан под поисковый трафф, пиарится я особо не буду. Всем спасибо за внимание!
Удачи мне, блогу и Вам.