пʼятниця, 29 жовтня 2010 р.

Як правильно писати своє резюме!

Поставте себе на місце людини, яка шукає нового працівника. Ні, не так. Уявіть: ви працюєте, над проектом, іноді овертаймаєте, іноді фіксаєте баги, часу не вистачає - ну все як завжди. І тут вам кажуть "проведи співбесіду, ось резюме".
А от тепер подумайте, що ви хотіли б побачити в цьому резюме, щоб воно дало вам максимум інформації і при цьому забрало мінімум часу! І не присилайте, блін, суцільну простиню зі сухим переліком місць навчання і праці. Баба Зіна теж працює на великій софтверній фірмі, а часом і не одній - прибиральницею. І при цьому щей вповні могла закінчила не один вуз. З червоним дипломом. З відзнакою.

Будь-кому, хто оцінює ваші робочі можливості, потрібно побачити ваш код і подивитись, що ви РЕАЛЬНО РОБИЛИ.
Вишліть разом з резюме хоч один маленький проект З КОДОМ! Ви точно десь колись для когось робили тестові завдання чи внутрішні проектики на випробувальному терміні, тим більше, якщо ви працюєте з Флешем!

Опишіть в резюме в хронологічному порядку всі свої проекти, згруповані по місцях роботи. Опишіть в проекті технології, які на ньому використовувались (всі, не тільки ті, якими ви працювали), кількість людей, час скільки ви над проектом працювали, і головне, детально - свої обов'язки і досягнення на цьому проекті.

Коротко: досвід важливіший за освіту, його ставимо вище, спочатку стислий перелік знань, тоді - детальний опис проектів. КОМЕРЦІЙНИЙ ДОСВІД, все некомерційне пишем в районі освіти (або в ній же). ВУЗи мало хто знає, опишіть чого для реальної роботи ви таки навчились там, щоб було ясно, чи ви зовсім самоучка, чи мінімальне ООП і розуміння баз даних чи клієнт-сервера вам дали у ВУЗі.
В описі проекту країна замовника важлива, наявність на проекті ПМ-а (ProjectManager) - важлива, кількість людей - важлива! Крім просто опису проекту - роль в тімі, досягнення, нові знання, архітектурні рішення.


Ось вам приблизний шаблон резюме:

Name

Birth date: xx/xx/xxxx

Address xxxxx, Yyyy str., Lviv, Ukraine

Current address: Zzzzz Ave., Kiev, Ukraine

cell phone: +38 0xx xxx xx xx

mail, GTalk: aaaaaaa@gmail.com

ICQ: xxxxxxxxx

Skype aaa

LinkedIn: url

Keywords

Adobe Flash, ActionScript, Game development, Python/Cheetah, J2ME


Business area

Outsource, Software, RIA, web, RPG, mobile games, casual games, E-Commerce


Experience summary

· 8 years of commercial programming experience

· Extensive knowledge of Adobe Flash technology


Skills

Programming language/Technologies

· Flash (ActionScript 1.0, 2.0, 3.0) (5.5 years)

· Flex (1 year)

· Java/J2ME(mobile phone games)/JSP (1.5 years)

· HTML, JavaScript, XML (5 years)

· PHP/MySQL (2.5 years)

Development tools

· Macromedia/Adobe Flash (v 5 – CS3)

· FlashDevelop+FlexSDK, FlaxBuilder/FlashBuilder, IDEA+FlexSDK, Eclipse+MTASC

· Borland C++ Builder

· Microsoft Visual Studio

Source control software

· SVN

· CVS

· Microsoft SourceSafe

Databases

· MySQL

Operating Systems

· Microsoft Windows 95/98/2000/XP

· FreeBSD

Other

· Papervision3D


Work experience

Period:

Nov 2008

till now

Company name and location: AAA, Kiev

Job position: Senior Flash developer/team lead.

Project: BBB

Customer: USA

Project Description: http://BBB.com

AS3 FlexSDK 3.3, AMF, PHP (Zend)/MySQL

Online RPG brauser game.

Duties and Achievements:

· Team leader

· Communication with client

· General flash project architecture

· Development of components

· Code refactoring, optimization, architecture changes

· Jabber chat client (xiff), Twitter authorization, 3D effects

Team Size: 2 flash developers, 1 PHP/MySQL developer (Kiev team), ½ QA, 1 admin (Russia team), 1 flash developer, 1 server/DB developer, 1 QA (USA team).

Environment and Tools: Adobe Flash CS3, FlashDevelop+FlexSDK, SVN

Project: Mosaic (1 week)

Customer: Greek

Project Description: Small entertaining flash site.

User uploads their picture with info and sees mosaic, based on customer`s given picture from all uploaded pictures. Admin can view and manage all uploaded pictures

Duties and Achievements:

· User part (picture/info upload form, generating mosaic from server-given list and pictures, picture small random preview and full view)

· General flash part architecture

Team Size: PM, 1 flash developers, 1 server/DB developer, 1 artist

Environment and Tools: Adobe Flash CS3, FlashDevelop+FlexSDK, SVN


Period:

May 2007

Nov 2008

Company name and location TTTT, Lviv

Job position: Flash game developer

Project: Casual Flash games (2 month)

Customer: Polish

Project Description:

Small casual games

Duties and Achievements:

· Development of games

· Team leader

· Learned AS3, MVC pattern

· Created project architecture for separating graphics and developing process (AS2, AS3 developing tools)

Team Size: 1 developer, 1 artist

Environment and Tools: Adobe Flash 8, CS3, Eclipse+MTASC, FlashDevelop+FlexSDK

Project: Internal reporting system (1 year)

Customer: Internal, Ukraine

Project Description:

PHP/MySQL internal portal

· employees managing and complicated right levels

· employees reporting by project

· projects managing

· bug tracking system

· complicated reports for different level managers

Duties and Achievements:

· general PHP code optimization

· reports development

· universal module for any item modifying history

· bug fixing

Team Size: PM, 3 server developers, 2 Qas

Environment and Tools: Zend Studio, PHPMyAdmin, Apache, CVS


Period:

Jan 2002

Jan 2004

Different freelance projects, demo, effects, non-commercial projects, practical work:

· C++ Builder,

· Java, J2ME,

· PHP/MySQL,

· C++ (for Linux, Symbian), HTML/JS, Flash.


Education

Period:

1999 – 2004

Lviv Ivan Franko National University, department of Applied Mathematics and Informatics, specialty: Informatics, specialist`s degree.

Learned: C++ (4 years), math base for computer graphics (and 3d), HTML/JS, C++ Builder, SQL, Interbase/FireBird, FoxPro, Java 3D, ESRI Map Object, ESRI ArcView.v31

Master's thesis: 3-D visualization of results of mathematic calculations on server-side


Personal data

· Marital status, children: no

· Driving license: no

· Hobbies: Horse riding, snooker, hiking, dog, swimming

· Other: UAFPUG (http://fpug.org.ua/, ) member, speaker.


Certificates

No


Languages

· English – intermediate low

· Spanish – intermediate high

· Ukrainian – native

· Russian – fluent




Це шаблон з мого резюме. На моїх співбесідах переважно не задавали глупих питань типу "а що таке ООП" чи "як у Флеші аплоадати на сервер файл" - питають по проектах, щоб перевірити правдивість написаного і уточнити реальний об'єм роботи і якість отриманих навиків.
Коли в тебе чітко описано, що ти робив (навіть якщо це щось реально бігаючим не можна побачити в мережі), бачили твій код - то ясно, що ти вже ну точно знаєш, як працювати з класами, фільтрами, ефектами, інтерфейсами, серіалізацією, парсерами...

Коротше кажучи - напишіть один раз нормальне резюме! Ззекономите так і собі і людині, яка має проводити вам співбесіду, час і іноді навіть нерви.

середа, 27 жовтня 2010 р.

використовуйте Error, throw, catch,

ось тут я провтикала і все неправильно нарадила (хоча для дійсно лінивих ;) той варіант буде найкращим).

робити потрібно так (чекаю помідорів від unlarik):


var error: Error = new Error("This call is invalid");
trace(error.getStackTrace());


так взагалі треба писати свою систему виводу дебаг-інформації.

а зовсім правильно описані в тому пості ситуації писати так:


...
throw new Error("This call is invalid");
...

...

try{
...
} catch(error: Error) {
trace(error);
trace(error.getStackTrace());
}

репост з буза: питання про замовників

а скажіть-но дружочки-програмісти і їх манагери: це у всіх нідерландців така фішка працювати без піемів, тестерів та інших організаційних ієрархій, організовуючи лінійний дозований по часу конвеєр? чи то в мене такий досвід попався кривий кілька раз підряд на таку цікаву комбінацію?
бо з американами я такого собі навіть не уявляю (йдеться про замовників більш-менш великих проектів)

і ще цікава тенденція європейців: постановка пошуку працівників типу "шукаєм <якась недитяча технологія> + <якась інша недитяча технологія, не суміжна з першою дитячою технологією>", при цьому взагалі не дають опису реквайрементів, проекту і т.п. - це вони, я так розумію, з індуськими фрілансерами звикли працювати? - типу кидають об'яву, на неї злітається з двадцяток піаністів, з яких 10 знають як правильно пишуться назви недитячих технологій, з них знаходиться два, які піанінять щось більш-менш працююче і з ними якось працюють?

пʼятниця, 15 жовтня 2010 р.

Підказка для лінивих:

Ситуація: у вас баг. Трейс, дебаг, відтворення... результат - якась функція викликається 2 рази підряд. Або більше, ніж має, або в тих умовах, в яких вона не повинна викликатись (до ініціалізації). І все дуже складно - дуже багато різних подій, потенційних місць виклику функції і просто лінь )))) - що неможливо визначити зразу звідки йде косячний виклик. Зато умову, коли виклик функції відбувається неправильно, перевірити можна майже завжди, ну хоча б тупо поставивши лічильник. От в цю умову і пихаєм такий простий код:

var spr: Sprite;
spr.alpha = 1;

Що станеться при виконанні цього коду? - помилка. А що відобразиться у вікні флешплеєра про цю помилку? - правильно: те, що нам потрібно - повний шлях виклику нашої нещасної функції.

середа, 6 жовтня 2010 р.

Порада для проектів зі складною системою подій.

У великих проектах переважно є своя складна система подій (з власними подіями) - вони генеруються користувачем, відповідями зі сервера, по таймеру, автоматично, сукупністю інших подій і т.п.
Вже не перший раз в моєму теперішньому проекті зіткнулась з тим, що в цих подіях мені було б добре знати, чи подія згенерована користувачем.

Найпростіший приклад - користувач може відкрити сторінку повідомлень і звітів, і тоді система посилає запит на сервер за цими самими повідомленнями і звітами. Але ще в системі є панелька, яка підсвічує користувачу, чи прийшли йому нові повідомлення/звіти. Для цього панелька теж генерує такий самий запит, по таймеру (кожну хвилину, на приклад). І ще в системі можливі події, які будуть призводити до оновлення даних зі сервера по звітах і повідомленнях. А от серверу ще потрібно знати час неактивності користувача, і якщо цей час більше години - вилоговувати його. Для цього серверу потрібно розрізняти, де запити, які означають активність користувача, а де - автооновлення.

Ще приклад - є функція показу початкового стану з відображенням панелі управління, яку потрібно викликати і коли всі вікна закриті і коли користувач натиснув кнопку повернення до початкового стану. Коли це все писалось, ніхто не думав про те, що повернення до початкового стану з відображенням панелі і закриття всіх вікон треба розділити, їх зв'язали намертво і зав'язали на одну подію, і про ситуацію, коли користувач відкрив кілька вікон одночасно - теж ніхто не думав.

Прикладів може бути багато - і їх всі можна було б обійти, розділивши функції, зробивши окремі запити, правильно зі самого початку організувавши архітектуру всього проекту. Але, по-перше, зовсім правильно організувати архітектуру великого проекту, на якому щей спостерігається текучка девів, відсутність піема і ТЗ кардинально міняється на льоту (у флеші таке часто трапляється) - нереально. Тим більше, якщо приходиш в середину проекту. Переписати все нафіг - бажання логічне, але на це вже нема часу, і знову-таки: не факт, що ти сам це все перепишеш правильно (див попередній пост).

А от навіть якщо прийшов у проект зі середини, вписати у всю систему подій один маленький прапорець - поки коли дедлайни не тиснуть на горло - не так складно, їсти не просить, а допомогти потім може в дуже багатьох ситуаціях.

понеділок, 4 жовтня 2010 р.

Оголошуєм два класи в одному файлі

Часто потрібно оголосити допоміжну "структуру" - клас, який ніде більше не буде використовуватись і яким не хочеться засмічувати проект.

package {
  
   public class SomeClass {
     
     public function SomeClass() {
       
    }
    
  }
}

  class HelperClass {
    
  }


До речі, раджу завжди в файлі ставити завершуючий EOF (в більшості IDE це можна налаштувати автоматом, в FlashDevelop - Tools-Program Settings-FlashDevelop-Formatting-Ensure Last Line End, і там же є ще одна опція, яку раджу включати - FlashDevelop-Tools-Program Settings-FlashDevelop-Formatting-Strip Ending Spaces).

Здавалось би, прості банальні істини, які всі мали б знати

Влияние качества кода на бизнес

Використовуємо таймери для вирішення різних проблем

От є, здавалось би, проста ситуація (JS-ники її добре знають): користувач наводить мишку на елемент А, з'являється елемент Б, користувач може вибрати один з піделементів Б або забрати мишку з А чи Б, передумавши, і Б має зникнути (приклад - випадаюче, контекстне менюменю). Все просто: навішуємо на стейдж маус лісенер і перевіряємо, чи перетинається з А або Б. Ні - ховаєм Б (чому не навішувати на Б лісенер MOUSE_OUT ви самі дідете методом проб і помилок - якщо досі не дійшли).
А якщо А і Б - зовсім окремі об'єкти, які один про одного не мають нічого знати, і А з Б не перетинаються, тому, при переведенні мишки з А на Б, Б закриється? Ну знову все просто: при створенні об'єкта Б не ініціалізуєм лісенер мишки стейджем доти, поки мишка на нього не зайшла. Але тоді відведення мишки з А його не закриє, поки користувач не наведе мишку на Б - це не зручно. Тоді можна в Б встановлювати прапорець, щось типу _canBeClosed=false, при наведенні мишки на Б піднімати його, у лісенері стейджа перевіряти цей прапорець, і додатково в Б, при появі на екрані, запустити таймер (в середньому на 1.5-2 секунди), на його TIMER_COMPLETE теж піднімати цей прапорець.

До речі, всі "випадіючі" елементи додавайте в стейдж - щоб вони завжди перекривали всі інші візуальні елементи і вам не треба було думати, в якій послідовності які елементи були додані на екран і хто кого перекриє. Ну хто вже зовсім не знає - для їх позиціонування використовуйте localToGlobal().

Ще ситуація: є "важка" функція (запит до сервера за тими самими даними), яка має викликатись тільки один раз в один момент часу. А може вона спрацювати на якийсь лісенер, а в проекті івентами плюються всі кому не лінь і розгрібати цю систему нема можливості, або з якихось причин відрубувати користувачу можливість генерувати івенти, які запускають цю функцію - нема. Словом, є у вас ризик подвійного виклику (і бардаку в наслідок цього) і відловити його причину дуже важко (хоч це і потрібно обов'язково зробити), а проблему вирішити треба, і то дуже швидко. Знову-таки, оголошуєься в тому ж класі статичний прапорець, по замовчуванні false, у виклику функції він перевіряється, якщо false - функція виконується, прапорець піднімається і запускається таймер на потрібний для ігнорування всіх наступних викликів цієї функції час, на його TIMER_COMPLETE прапорець знову встановлюється в false.

Ну і, хто ще раптом не знає, як перевіряти швидкість виконання операцій:

var startDate: Date;
var test1Date: Date;
var test2Date: Date;
var str: String;

startDate = new Date();
for(var i: int = 0; i < 100000; i++) {
  str = _function1(args);
}
test1Date = new Date();

for(var j: int = 0; j < 100000; j++) {
  str = _function2(args);
}
test2Date = new Date();

trace(test1Date.time - startDate.time, test2Date.time - test1Date.time);

Тільки не використовуйте в середині циклів trace - його обробка всіми плагінами, які його ловлять, може давати похибку.