CoffeeScript #11
کامپایل خودکار CoffeeScript
همانطور که گفته شده CoffeeScript یک لایه میان شما و جاوااسکریپت است و هر زمان که فایل CoffeeScript تغییر کرد، باید به صورت دستی آن را کامپایل کرد. خوشبختانه CoffeeScript روشهای دیگری را برای کامپایل کردن دارد که به وسیله آن میتوان چرخهی توسعه را بسیار سادهتر نمود.
در قسمت اول گفته شد، برای کامپایل فایل CoffeeScript با استفاده از coffee به صورت زیر عمل میکردیم:
coffee --compile --output lib src
حال به کامپایل خودکار CoffeeScript توجه کنید.
Cake
Cake یک سیستم فوق العاده ساده برای کامپایل خودکار است که مانند Make و Rake عمل میکند. این کتابخانه همراه پکیج coffee-script npm نصب میشود و برای استفاده با فراخوانی cake اجرا میشود.
برای ایجاد فایل tasks در cake که Cakefile نامیده میشود، میتوان از خود CoffeeScript استفاده کرد. برای اجرای cake با استفاده از دستور [cake [task] [options میتوان عمل کرد. برای اطلاع از لیست امکانات cake کافی است دستور cake را به تنهایی اجرا کنید.
وظایف را میتوان با استفاده از تابع task، با ارسال نام و توضیحات (اختیاری) و تابع callback، تعریف کرد. به مثال زیر توجه کنید:
fs = require 'fs' {print} = require 'sys' {spawn} = require 'child_process' build = (callback) -> coffee = spawn 'coffee', ['-c', '-o', 'lib', 'src'] coffee.stderr.on 'data', (data) -> process.stderr.write data.toString() coffee.stdout.on 'data', (data) -> print data.toString() coffee.on 'exit', (code) -> callback?() if code is 0 task 'build', 'Build lib/ from src/', -> build()
همان طور که مشاهده میکنید پس از تغییر در فایل CoffeeScript باید به صورت دستی cake build را فراخوانی کنیم که این دور از حالت ایده آل است.
خوشبختانه دستور coffee پارامتر دیگری به نام watch-- دارد که به وسیله آن میتوان تمامی تغییرات یک پوشه را زیر نظر گرفت و در صورت نیاز دوباره کامپایل انجام شود. به مثال زیر توجه کنید:
task 'watch', 'Watch src/ for changes', -> coffee = spawn 'coffee', ['-w', '-c', '-o', 'lib', 'src'] coffee.stderr.on 'data', (data) -> process.stderr.write data.toString() coffee.stdout.on 'data', (data) -> print data.toString()
task 'open', 'Open index.html', -> # First open, then watch spawn 'open', 'index.html' invoke 'watch'
option '-o', '--output [DIR]', 'output dir' task 'build', 'Build lib/ from src/', -> # Now we have access to a `options` object coffee = spawn 'coffee', ['-c', '-o', options.output or 'lib', 'src'] coffee.stderr.on 'data', (data) -> process.stderr.write data.toString() coffee.stdout.on 'data', (data) -> print data.toString()
Cake یک روش عالی برای انجام وظایف معمول به صورت خودکار است، مانند کامپایل فایلهای CoffeeScript است. همچنین برای آشنایی بیشتر میتوانید به سورس cake نگاهی کنید.
برای شروع کار ابتدا دو دیتابیس به اسمهای databasefrm و databaseto میسازیم. دیتابیس databasefrm شامل یک جدول به اسم emp با سه فیلد ID,Name,Address میباشد. قصد داریم جدول tmp از دیتابیس databasefrm را به دیتابیس databaseto انتقال دهیم. برای انجام این کار، یکی از روشهای زیر را استفاده خواهیم کرد:
روش 1 : استفاده از کوئری
ساختار کلی انجام این عمل به صورت زیر خواهد بود:
Select * into DestinationDB.dbo.tableName from SourceDB.dbo.SourceTable
select * into databaseto.dbo.emp from databasefrm.dbo.Emp
حال اگر بخواهیم یک کپی از جدول را در دیتابیس جاری ایجاد کنیم، ساختار آن به صورت زیر خواهد بود :
select * into newtable from SourceTable
select * into emp1 from emp
میتوانیم فقط فیلدهایی مشخص را به جدول دیگر کپی کنیم. برای انجا این کار کافیست به جای * اسم فیلدهای مورد نیاز را نوشت که ساختار دستوری آن به صورت زیر است :
select col1, col2 into <destination_table> from <source_table>
select Id,Name into databaseto.dbo.emp1 from databasefrm.dbo.Emp
بعد از اجرای کوئری فوق نتیجه به صورت زیر خواهد بود :
کد فوق باعث کپی کردن فیلدهای Id,Name شده است.
اگر بخواهیم فقط ساختار جدول را کپی کنیم روند کار به صورت زیر خواهد بود :
select *into <destination_database.dbo.destination table> from _ <source_database.dbo.source table> where 1 = 2
select * into databaseto.dbo.emp from databasefrm.dbo.emp where 1 = 2
نکته: هر وقت نیاز بود که فقط فیلدهای یک جدول را دریافت کنید، میتواند از کدی همانند فوق استفاده کنید؛ با یک شرط که همیشه false برگرداند. ولی راه بهتری که توصیه میکنم استفاده از Top در دستور Select میباشد. نمونهای از دستور فوق:
select top(0) * into databaseto.dbo.emp from databasefrm.dbo.emp
روش 2: ویزارد
جهت تهیه کارهای فوق به صورت ویزارد، به صورت خلاصه فقط به روند انجام کار بسنده میکنیم:
1- SSMS را باز کنید.
2- بر روی دیتابیس مورد نظر کلیک راست کرده و از منوی ظاهر شده Task را انتخاب نموده و در کادر بازشو Export data را انتخاب کنید.
3- در پنجرهی ظاهر شده بر روی دکمه next کلیک کرده و در پنجره بعدی، نوع اعتبار سنجی را انتخاب کرده و دیتابیس مورد نظر را انتخاب نمایید (databasefrm).
4- همانند مرحله 3 است با این تفاوت که اینبار دیتابیس مقصد را انتخاب میکنیم (databaseto).
5- در پنجرهی بعدی گزینه اول را انتخاب کرده (copy data from ...) و بعد از کلیک بر روی next در پنجره ظاهر شده، جدول یا جداول مورد نظر را انتخاب کنید.
روش 3 : تولید اسکریپت
با استفاده از دو روش فوق فقط میتوانستیم ساختار جداول و دادههای آن را انتقال بدهیم. برای انتقال کامل جداول مثل تریگرها، قیدها و ... میبایست از جدول یا جداول اسکریپت تولید و در نهایست اسکریپت را اجرا نماییم.
انتخاب دیتابیس مورد نظر و بعد انتخاب مواردی که قصد داریم از آنها اسکریپت ایجاد کنیم و در پایان اسکریپت مورد نظر را بر روی دیتابیس مقصد (databaseto) اجرا میکنیم.
و در پایان نهایت تشکر را از تمام عزیزان و دوستان نویسندهی سایت دارم. امیدوارم در سال 94 شاهد موفقیتهای خوبی در حوزهی نرم افزار باشیم.
public interface IBridge { string Send(string parameter); } public class WebService: IBridge { public string Send(string parameter) { return parameter + " sent by WebService"; } } public class API: IBridge { public string Send(string parameter) { return parameter + " sent by API"; } }
public abstract class Abstraction { public IBridge Bridge; public abstract string SendData(); } public class SendEmail : Abstraction { public override string SendData () { return Bridge.Send("Email"); } } public class SendSMS: Abstraction { public override string SendData () { return Bridge.Send("SMS"); } }
Abstraction ab1 = new Email(); ab1.Bridge = new WebService(); Console.WriteLine(ab1.SendData ());
ab1.Bridge = new API(); Console.WriteLine(ab1.SendData ());
Abstraction ab2 = new SMS(); ab2.Bridge = new WebService(); Console.WriteLine(ab2.SendData ());
ab2.Bridge = new API(); Console.WriteLine(ab2.SendData ());
در مای اس کیو ال برای تعریف یک تابع از ساختار زیر استفاده میکنیم :
DELIMITER $$ CREATE DEFINER=`user_name`@`host_name`|CURRENT_USER PROCEDURE `transition_name`( IN | OUT | INOUT `parameter_name` type(bigint,int , ...) ) SQL SECURITY DEFINER| INVOKER transition_name: BEGIN #----procedure_body END
در قسمت
DEFINER=`user_name`@`host_name`|CURRENT_USER
CURRENT_USER
نکته بعدی : قسمت
SQL SECURITY DEFINER| INVOKER
برای شرح تراکنش، مثال پرداخت بانکی را شرح میدهیم:
DELIMITER $$ CREATE DEFINER=CURRENT_USER PROCEDURE `transition_pay`( #-----------input value IN `pay_value` bigint, IN `admin_id` int, #-------------result code OUT `result` bigint ) SQL SECURITY INVOKER transition_pay: BEGIN DECLARE admin_credit DOUBLE DEFAULT 0; SELECT `Credit` INTO admin_credit FROM `Admin` WHERE `Admin_id` = admin_id #----- transaction body END
اگر بخواهیم به دلیلی قبل از رسیدن به تراکنش آن را کنسل کنیم، میتوان از دستور LEAVE استفاده کرد:
مثال :
IF admin_id=0 THEN set result = -1 ; #exit procedure LEAVE transition_pay; END IF;
START TRANSACTION; INSERT INTO `PayBalance` (`Value` , `Admin_id` ) VALUES (pay_value, admin_id); UPDATE `Admin` SET `Credit`=admin_credit + pay_value WHERE `admin_id`=admin_id; COMMIT;
حال اگر بخواهیم به دلیلی داخل تراکنش آن را لغو کنیم از دستور ROLLBACK استفاده میکنیم.
مثال:
IF pay_value=0 THEN set result = -1 ; #roolback procedure ROLLBACK ; END IF;
SET autocommit = {0 | 1}
نکته آخر اینکه با استفاده ار زبان پی اچ پی هم میتوان تراکنشی را شروع و تمام کرد و بین این دو دستورات مورد نظر را نوشت و همیشه وجود پروسیجر الزامی نیست.
انگیزه اصلی این نوشته شروع کار با AngularJs و استفاده از scope در این کتابخانه است. بیشتر دوستانی که کار با این کتابخانه را شروع میکنند و تجربه زیادی با جاوا اسکریپت ندارند، با مفهوم ارث بری scope مشکل پیدا میکنند.
ارث بری در scope های AngularJs موضوع پیچیده و عجیب و غریبی نیست. در واقع همان ارث بری prototype ای است که جاوا اسکریپت پشتیبانی میکند.
این روش توضیح خیلی ساده ای دارد.
در هنگام دسترسی به مقدار یک خصوصیت روی یک شی اگر آن خصوصیت در شی مورد نظر وجود نداشته باشد جاوا اسکریپت یک سطح در زنجیرهی prototype ها بالا رفته و به شی پدر دسترسی پیدا کرده و در آن به دنبال مقدار خصوصیت میگردد. این کار را آن قدر ادامه میدهد تا به بالاترین سطح برسد و دیگر چیزی پیدا نکند.
این بالا رفتن در زنجیرهی prototype ها عملا با دسترسی به خصوصیت prototype انجام میشود.
فرض کنید دو شی (دقت کنید که میگویم شی) به نامهای employee و person داریم. این دو شی را به صورت زیر تعریف میکنیم.
var person = { type: '', name:'No Name' }; var employee = { };
شی employee الان هیچ خصوصیت ای ندارد. و دسترسی به هر خصوصیت ای از آن هیچ نتیجهای در بر نخواهد داشت.
console.log('Before Inheritance -> employee.name = ' + employee.name);
با مقدار دهی کردن خصوصیت prototype مربوط به employee به person این شی را از person ارث بری میکنیم.
employee.__proto__ = person;
بعد از اجرا شدن این خط از برنامه هنگام دسترسی پیدا کردن به مقدار name، مقدار اصلی آن که در شی person وارد شده بود را خواهیم دید.
ملاحظه کردید که وقتی خصوصیت name در شی مورد نظر وجود نداشت به شی پدر رجوع شد و مقدار خصوصیت مربوطه از آن بدست آمد.
الان فرض کنید که در قسمتی از برنامه خواستیم مقدار name در شی employee را به مقدار مشخصی تغییر دهیم. به طور مثال:
employee.name = 'farid'; console.log('After Assiginig -> employee.name = ' + employee.name); console.log('After Assiginig -> person.name = ' + person.name);
با چاپ کردن مقادیر person.name و employee.name انتظار دارید چه نتیجه ای ببینید؟
اگر از زبانهای شی گرایی مانند #C آمده باشید احتمالا خواهید گفت مقادیر یکسان خواهند بود. ولی در واقع این گونه نیست. مقدار person.name همان مقدار اولیه ما خواهد بود و مقدار employee.name نیز ‘farid’.
دلیل این رفتار یک نکته ساده و اساسی است.
جاوا اسکریپت فقط در زمان دسترسی به یک خصوصیت در صورت پیدا نکردن آن در شی مورد نظر ما به سطوح بالاتر prototype ای رفته و دنبال آن خصوصیت میگردد.
اگر ما قصد مقدار دهی به یک خصوصیت را داشته باشیم و خصوصیت مورد نظر ما در شی وجود نداشته باشد جاوا اسکریپت یک نسخه محلی از خصوصیت برای آن شی میسازد و مقدار ما را به آن میدهد.
در واقع در مثال ما هنگام مقدار دهی به employee.name آن خصوصیت در شی موجود نبود و یک نسخه محلی به نام name در شی ایجاد شد و دفعه بعدی که دسترسی به مقدار این خصوصیت اتفاق افتد این خصوصیت به صورت محلی وجود خواهد داشت و جاوا اسکریپت به سطوح بالاتر نخواهد رفت.
تمام کدهای بالا در bin زیر موجود هستند.
var person = { info : { name: 'No Name', type: '' } }; var employee = {};
employee.__proto__ = person;
employee.info.name = 'farid';
console.log('After Assiginig -> employee.name = ' + employee.info.name); console.log('After Assiginig -> person.name = ' + person.info.name);
طراحی یک Interceptor برای یک دست سازی ی و ک
در اینجا کدهای کلاس YeKeInterceptor را ملاحظه میکنید. در متدهایی که به کلمهی Executing ختم میشوند، میتوان به دستورات SQL تولید شده توسط EF، پیش از اعمال بر روی بانک اطلاعاتی دسترسی داشت:
public class YeKeInterceptor : IDbCommandInterceptor { public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext) { command.ApplyCorrectYeKe(); } public void NonQueryExecuted(DbCommand command, DbCommandInterceptionContext<int> interceptionContext) { } public void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext) { command.ApplyCorrectYeKe(); } public void ReaderExecuted(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext) { } public void ScalarExecuted(DbCommand command, DbCommandInterceptionContext<object> interceptionContext) { } public void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext) { command.ApplyCorrectYeKe(); } }
public static class YeKe { public const char ArabicYeChar = (char)1610; public const char PersianYeChar = (char)1740; public const char ArabicKeChar = (char)1603; public const char PersianKeChar = (char)1705; public static string ApplyCorrectYeKe(this object data) { return data == null ? null : ApplyCorrectYeKe(data.ToString()); } public static string ApplyCorrectYeKe(this string data) { return string.IsNullOrWhiteSpace(data) ? string.Empty : data.Replace(ArabicYeChar, PersianYeChar).Replace(ArabicKeChar, PersianKeChar).Trim(); } public static void ApplyCorrectYeKe(this DbCommand command) { command.CommandText = command.CommandText.ApplyCorrectYeKe(); foreach (DbParameter parameter in command.Parameters) { switch (parameter.DbType) { case DbType.AnsiString: case DbType.AnsiStringFixedLength: case DbType.String: case DbType.StringFixedLength: case DbType.Xml: parameter.Value = parameter.Value is DBNull ? parameter.Value : parameter.Value.ApplyCorrectYeKe(); break; } } } }
در آن، CommandText و همچنین parameter.Valueها در صورت رشتهای بودن، اصلاح میشوند.
سربار این روش نسبت به روشهای پیشین استفاده از Reflection کمتر است. همچنین اشیاء پیچیده و تو در تو را نیز بهتر پشتیبانی میکند؛ چون در مرحله Executing، کار پردازش این اشیاء پایان یافته و SQL خام نهایی آن در اختیار ما است.
نحوهی استفاده از YeKeInterceptor
در آغاز برنامه (برای مثال متد Application_Start فایل Global.asax.cs برنامههای MVC )، سطر زیر را فراخوانی کنید:
DbInterception.Add(new YeKeInterceptor());
یک مثال کامل برای دریافت
Sample32.cs
سپس روی Web Site ایجادشده راست کلیک کنید و از منوی بازشده Property Pages را انتخاب کنید. روی گزینهی Add Reference کلیک کنید، سپس پروژهی MyNewsWCFLibrary را از قسمت Solution انتخاب کرده و دکمهی OK را بفشارید.
دکمهی OK را بفشارید و از Solution Explorer فایل Web.Config را باز کنید. پیش از تغییرات مد نظر باید چنین محتوایی داشته باشد:
<?xml version="1.0" encoding="utf-8"?> <!-- For more information on how to configure your ASP.NET application, please visit http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <system.web> <compilation debug="true" targetFramework="4.5" /> <httpRuntime targetFramework="4.5" /> </system.web> </configuration>
متن آنرا به این صورت تغییر دهید:
<?xml version="1.0" encoding="utf-8"?> <!-- For more information on how to configure your ASP.NET application, please visit http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <system.web> <compilation debug="true" targetFramework="4.5" /> <httpRuntime targetFramework="4.5" /> </system.web> <system.serviceModel> <serviceHostingEnvironment> <serviceActivations> <add factory="System.ServiceModel.Activation.ServiceHostFactory" relativeAddress="./HamedService.svc" service="MyNewsWCFLibrary.MyNewsService"/> </serviceActivations> </serviceHostingEnvironment> <behaviors> <serviceBehaviors> <behavior> <serviceMetadata httpGetEnabled="true"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
همانگونه که مشاهده میکنید به وسیلهی تگ add factory سرویسها را به وبسایت معرفی میکنیم. با relativeAddress میتوانیم هر نامی را به عنوان نام سرویس که در URL قرار میگیرد معرفی کنیم. چنانکه من یه جای MyNewsService از نام HamedService استفاده کردم. و در صفت service فضای نام و نام کلاس سرویس را معرفی میکنیم.
اکنون پروژه را اجرا کنید. در مرورگر باید صفحه را به اینصورت مشاهده کنید:
نیازی به یادآوری نیست که شما میتوانید این پروژه را در IIS سرور راهاندازی کنید تا کلیهی مشتریها به آن دسترسی داشته باشند. هرچند پیش از آن باید امنیت را نیز در WCF برقرار کنید.
توجه داشته باشید که روشی که در این بخش به عنوان میزبانی WCF مطرح کردم یکی از روشهای میزبانی WCF است. مثلاً شما میتوانستید به جای ایجاد یک WCFLibrary و یک Web Site به صورت جداگانه یک پروژه از نوع WCF Service و یا Web Site ایجاد میکردید و سرویسها و مدل Entity Framework را به طور مستقیم در آن میافزودید. روشی که در این درس از آن بهره برده ایم البته مزایایی دارد از جمله اینکه خروجی پروژه فقط یک فایل DLL است و با هر بار تغییر فقط کافی است همان فایل را در پوشه Bin از وبسایتی که روی سرور میگذارید کپی کنید.
در بخش هشتم با هم یک پروژهی تحت ویندوز خواهیم ساخت و از سرویس WCF ای که ساخته ایم در آن استفاده خواهیم کرد.
متدها به روشهای مختلفی تعریف میشوند و هر کدام رفتارهای مختلفی را در زمان ارث بری از خود نشان میدهند. روش استفاده استاندارد از آنها مانند شکل بالاست ولی در صورتیکه بخواهید این روش را تغییر دهید میتوانید به آنها کلمات کلیدی اضافه کنید.
Abstract methodها
abstract متدها به هیچ جایی اشاره نمیکنند. مانند شکل زیر:
درصورتی که کلاسهای شما دارای اعضای abstract باشند، باید خودشان نیز abstract باشند. شما نمیتوانید از این کلاسها وهلهایی ایجاد نمایید؛ ولی میتوانید از آنها در ارث بری سایر کلاسها استفاده کنید و از سایر کلاسها یک وهله ایجاد نمایید.
public abstract class Person { public abstract void ShowInfo(); } public class Teacher : Person { public override void ShowInfo() { Console.WriteLine("I am a teacher!"); } } public class Student : Person { public override void ShowInfo() { Console.WriteLine("I am a student!"); } }
Person person = new Teacher(); person.ShowInfo(); // Shows 'I am a teacher!' person = new Student(); person.ShowInfo(); // Shows 'I am a student!'
Virtual methodها
از کلاسهای دارای Virtual method میتوان یک وهله ایجاد کرد و حتی امکان تحریف Virtual methodهای کلاس پایه در Derived-class وجود دارد. مانند کد زیر:
public class Person { public virtual void ShowInfo() { Console.WriteLine("I am a person!"); } } public class Teacher : Person { public override void ShowInfo() { Console.WriteLine("I am a teacher!"); } }
باید توجه داشته باشید تصویر بالا با تصویر اول تفاوتی ندارد بدلیل اینکه virtual methodها به روش استاندارد پیاده سازی اشاره میکنند. با استفاده از کلمه کلید virtual شما به عنوان مثال به کلاس Person میگویید که متد ()ShowInfo میتواند پیاده سازیهای دیگری هم شاید داشته باشد و سایر پیاده سازیهای دیگر این متد باید با کلمه کلیدی override در کلاس دیگر (Teacher) مشخص شوند.
در ضمن در صورتیکه پیاده سازی دیگری از آن متد ارائه نشود از پیاده سازی کلاس پایه استفاده میشود.
public class Student : Person { } Person person = new Teacher(); person.ShowInfo(); // Shows 'I am a teacher!' person = new Student(); person.ShowInfo(); // Shows 'I am a person!'
نکته پایانی:
کلمه کلیدی new در متدهای کلاسهای پایه و Derived مانند shadowing عمل میکند. برای بیان بهتر به کد زیر توجه کنید:
public class Person { public void ShowInfo() { Console.WriteLine("I am Person"); } } public class Teacher : Person { public new void ShowInfo() { Console.WriteLine("I am Teacher"); } }
Senior Developer .Net Technologies Resume : ------------------------------------
احتمالا اکثر شما هم در آگهیهای استخدام برنامه نویس، با واژه Senior Developer یا برنامه نویس ارشد برخورد داشته اید. حال به راستی به چه کسی برنامه نویس ارشد گفته میشود. یا بهتره بگم که چه زمانی ما میتونیم خودمون را یک برنامه نویس ارشد بدونیم؟
از آنجا که تعریف مشخصی برای این واژهها در فرهنگ خاصی وجود ندارد و عموما هر کسی یک تعریف خاص با توجه به سلیقه خودش در این زمینه ارائه میدهد نمیتوان یک شرح واحد از این واژهها نظیر Senior Developer یا حتی Junior Developer ارائه داد. در نتیجه قصد دارم با توجه به تجربیات شخصی، این موارد رو تشریح کنم.
در خیلی موارد منظور از برنامه نویس ارشد، کسی است که:
- در حداقل یک یا دو زبان برنامه نویسی تجربه داشته باشد؛
- با تکنولوژیهای مهم و کارآمد ارائه شده در آن زبان آشنایی کامل داشته باشد؛
- توانایی استفاده از این تکنولوژیها را در جای مناسب پروژه دارا باشد؛
- با الگوهای برنامه نویسی (Design Pattern) آشنایی کامل داشته باشد؛
- بتواند به سایر اعضای تیم در حل مشکلات و باگهای برنامه کمک کند؛
- یک خطایاب قهار باشد(منظور این است با اکثر استثنائات و خطاهای متداول زبان و تکنولوژی که پروژه با آن پیاده سازی میشود آشنا باشد و بداند که چه زمان این خطا به وجود میآید و چگونه میتوان این موارد را برطرف کرد)؛
- باید با پیاده سازی سیستمهای سرویس گرا (SOA) جدای از تکنولوژی پیاده سازی آن آشنایی کامل داشته باشد؛
- باید با روشهای تست و خطایابی و ابزارهای توسعه و پیاده سازی آن آشنا بوده و توانایی استفاده از آنها را در پروژههای خود داشته باشد؛
- یک برنامه نویس ارشد باید در زمینه تخمین زمان تکمیل پروژه مهارت داشته باشد. باید بتواند مدت زمان لازم برای تکمیل یک Task را تخمین بزند و در همین مدت زمان، Task مربوطه را به صورت کامل پیاده سازی نماید.
- در خیلی موارد باید بتواند هماهنگی لازم را بین اعضای تیم برنامه نویسی ایجاد نماید؛
- و...
*ترتیب عبارات بالا دلیلی بر اولویت موارد ذکر شده نیست.
*منظور از آشنایی در عبارات بالا، یعنی تسلط و توانایی استفاده از آن با آگاهی تمام.
چه مدت زمان برای تبدیل شدن به یک برنامه نویس ارشد نیاز است؟
برای به دست آوردن مهارتها و تواناییهای یک برنامه نویس ارشد لازم است که حداقل 8 تا 10 سال تجربه برنامه نویسی در یک زبان را داشته باشید. البته این در مورد همگان صادق نیست . شاید کسی بتواند این راه را در کمتر از 8 سال طی نماید. این بستگی به تلاش و استعداد فرد دارد. اما تجربه بیشتر یعنی شرکت در پروژههای بیشتر و آمادگی بیشتر در حل مشکلات و مسائل مختلف در طی روند تکمیل پروژه. برای مثال در زمینه تخمین اجرای یک Task داشتن تجربه بیشتر خیلی به شما کمک خواهد کرد.
در پایان چهار ردیف یا رده مختلف را که بین برنامه نویسان رواج دارد ذکر میکنم.(از پایین به بالا)
Junior : عموما به کسی گفته میشود که 1 تا 3 سال تجربه برنامه نویسی دارد. معمولا کدهای نوشته شده توسط این افراد باید بررسی شود چون احتمال اشتباه در آن زیاد است. اکثر کدهای نوشته شده توسط این افراد به صورت dirty code است. راهنمایی هایی که به این افراد داده میشود شامل راهنمایی در زمینه ساختاری و الگوریتمی نیز میباشد.
Mid-Level : برنامه نویسان در این رده بین 4 تا 6 سال تجربه دارند. میتوانند به تنهایی نیز یک مشکل موجود در پروژه را حل نمایند. با مباحث مربوطه به طراحی کامپوننت آشنایی دارند و پروژه را بی نیاز از کامپوننت خواهند کرد. حتی در بعضی موارد میتوانند به تنهایی یک پروژه در سطح کوچک با متوسط را توسعه دهند.
Senior Developer : در بالا به صورت کامل شرح داده شد.
Luminary : به صورت معمول به کسی گفته میشود که تمام تواناییهای یک برنامه نویس ارشد را داراست و فقط تجربه برنامه نویسی آن قطعا از 10 سال بیشتر است.
از این واژه کمتر در ردههای برنامه نویسی استفاده میشود و بیشتر به همان واژه Senior Developer بسنده میکنند.