جلست؛ وإجتزت قبل ستة أيّام، تحديدا يوم 19/9/2019، امتحان Programming in C# 70-438 من قبل مايكروسوفت Microsoft وهذا الإمتحان يتعلق بتحديد مستويات المبرمجين الذين يستخدمون تلك اللغة في برمجة تطبيقاتهم على منصة الدوت نت. في هذه المقالة سأتحدث عن طريقة إجتياز هذا الإمتحان وماهي الإدوات التي ستعينك في إجتياز الامتحان من خلال الكتب أو المحاضرات أو المحاضرات المرئية (فيديوهات) وكيفية التسجيل للإمتحان.
لغة الـ
# C
لن أطيل الحديث في هذه الفقرة، نسبة لأنّ قارئ هذه المقالة حتما يعرف إمكانية هذه اللغة وبالتالي يريد فقط معرفة كيفية الإستعداد للإمتحان.
لغةالـ #C هي لغة ذات إستخدامات متعددة سواء في إنشاء أنظمة سطح المكتب أو مجالات الإنترنت سواء من خلال الهواتف الذكية او متصفحات الإنترنت، كما أيضا تستخدم في مجال لغة الآلة (اللغة تدعم هذا المجال من قبل سنين بسيطة)، كما أيضا تدعم مجال الخدمات من خلال الإنترنت Web Services. لكل تلك المجالات أصبحت الـ #C من اللغات المستخدمة بصورة كبيرة من قبل ملايين المستخدمين، وهي مدعومة من مايكروسوفت عملاق البرمجيات في العالم، تم إطلاق الـ C# 8 قبل يومين من كتابة تلك المقالة.
إمتحان الـ 70-483
هذا هو رمز الإمتحان. أولا يتوجب عليك قبل الجلوس للإمتحان ان تكون لديك خبرة في التعامل مع لغة الـ #C لمدة أقلّاها سنة، حتى تفهم من خلالها تركيب اللغة والجمل المستخدمة فيها وجميع الكلمات المحجوزة. الإمتحان مدتهُ ساعتين إضافة لـ 15 دقيقة أخرى تُعرض فيها سياسة الاتفاقية من مايكروسوفت وعدد الأسئلة لا يتجاوز الخمسين سؤال – أذكر في الـ Dump الذي امتحنت عليه كان عدد الأسئلة 41 سؤال. والتسجيل يتم من موقع مايكروسوفت وبعدها ينقلك لإحدى المواع الخدمية التي تتيح لك جدولة الإمتحان وطريقة دفع الرسوم – رسم الامتحان 165$ غير شامل الضريبة.
الإمتحان ليس بالشئ الصعب، فقط يتطلب منك تركيز دقيق وبعون الله تستطيع إجتيازه.
قبل كل شئ عليك أن تقوم بالدخول لصفحة الإمتحان وقراءة مواضيع الإمتحان ومعرفتها من هذا الرابط
https://www.microsoft.com/en-us/learning/exam-70-483.aspx
مع تنزيل وقراءة ورقة المواضيع الخاصة بالإمتحان بصيغة PDF والمكونة من ثلاثة صفحات بصورة جيدة وهذا أول متطلب وسيساعدك كثيرا في اجتياز الامتحان، لأنّ معرفة المواضيع بصورة دقيقة سيسهل عليك نقاط ضعفك وبالتالي التركيز على تقوية مهاراتك. هذا اولا
ثانيا: عليك تنزيل الكتاب الرسمي للإمتحان وموجود على موقع أمازون من هنا. وحتى تكون على بيّنة، الكتاب يتكون من 400 صفحة فقط، وهو لن يعلّمك لغة الـ #C بل فقط يوضح لك مواضيع الإمتحان مع التركيز عليها بصورة كبيرة فأي شي خارج نطاق الإمتحان لن تجده في الكتاب الرسمي.
ثالثا: يتوجب عليك الإعتماد كثيرا على الـ Documentation من مايكروسوفت حيث أنها المعتمدة الوحيدة والتي ستجد بها كل صغيرة وكبيرة خاصة بلغات البرمجة والتقنيات الخاصة بمايكروسوفت ومن دونها لن تتعرف على كل تفاصيل اللغة، ولأنه ببساطة لايوجد كتاب او فيديو يستطيع شرح كافة أجزاء اللغة نسبة لالآف العناصر والفئات الموجودة باللغة.
مايتوجب عليك معرفته!!
أي لغة برمجية يوجد بها أساسيات وجمل تعبيرية يتوجب عليك أولا معرفتها قبل الدخول والتعمّق في اللغة نفسها. في الـ #C ستحتاج لمعرفة التعامل مع المتغيرات. يوجد نوعان من المتغيرات في الـ #C –
Value types و Reference types والأولى تتعلق بالأرقام اما الثانية تتعلق بالفئات وبعض الأشياء الأخرى وبصورة مرتبطة بهذا الموضوع لابد أن تتعرف على كيفية إدارة الذاكرة خصوصا في ما يتعلق بالـ Reference types والجميل في لغة الـ #C أنها تقوم بإدارة الذاكرة بصورة تلقائية.
أيضا يتوجب عليك معرفة التعامل مع المؤشرات، في الـ #C يطلق عليها Delegate وهي التي تتيح لك استخدام الأساليب Methods كـ Argument ويرتبط معها مباشرة معرفة استخدام الـ Lambda Expression
الكتب التي ستفيدك في الإمتحان
هناك العديد من المصادر التي بإمكانك الإعتماد عليها. لكن كما ذكرت في الفقرة قبل السابقة يتوجب عليك اولا قراءة الكتاب الخاص بالإمتحان. لكن أيضا هناك بعض الكتب التي بإمكانك الإعتماد عليها ومنها:
Pro C# 7 and with .Net and .Net Core
C# 7 in a Nutshell
#CLR via C
في الحقيقة جميع تلك الكتب غاية في الروعة وقد تكون كافية لتعلّمك لغة C# بصورة كبيرة وليس فقط كي تساعدك للجلوس للإمتحان. وشخصيا هذه الكتب الثلاثة لا تفارق مكتبي نهائيا.
بالنسبة للكتاب الأول سيساعدك في إجتياز الإمتحان خصوصا في القسم الأول والثاني والرابع الخاص بالإمتحان.
بالنسبة للقسم الثالث الخاص بالإمتحان ستحتاج لقراءة الكتاب الرسمي للإمتحان مع الإعتماد على كتاب C# 7 in a nutshell فيه ستتعرف على مواضيع الـ Security وطريقة التعامل مع خوارزميات الـSecurity.
فرضا في القسم الخاص بعملية الـ Hashing وهي عمليه تقوم بتحويل الأرقام والحروف لرموز وبإمكانك إستخدام خوارزميات تساعدك على توليد هذه الرموز بأطوال محددة.
لو إفترضنا أننا نريد أن نقوم بعمل أساليب Methods تساعدنا على تحويل الكلمات السرية التي نستخدمها في الدخول لمواقع عديدة لرموز يصعب فكّها، حينها ستحتاج لعملية الـ Hashing وتخزين تلك الرموز في قاعدة البيانات.
دعني أنشي اسلوب يقوم بعمل توليد لأرقام مشفرة
static string ApplyHashing(string input)
{
HashAlgorithm hashAl = SHA256.Create();
byte[] hashData = hashAl.ComputeHash(Encoding.Default.GetBytes(input));
Console.WriteLine(hashAl.HashSize);
return Convert.ToBase64String(hashData);
}
في هذا الاسلوب قمت بإستخدام الفئة HashAlgorithm هذه الفئة تتيح لي إنشاء رموز يصعب تفكيكها من خلال استخدام الأسلوب ComputeHash.
في حال كنت تريد عمل مطابقة لتلك الرموز مع الكلمة الرئيسية التي تم توليد تلك الرموز منها بإمكانك عمل اسلوب جديد كالتالي:
static bool VerifyHash(string input, string hashValue)
{
HashAlgorithm sha = SHA256.Create();
byte[] hashData = sha.ComputeHash(Encoding.Default.GetBytes(input));
return Convert.ToBase64String(hashData) == hashValue;
}
أقوم بإستخدام هذا الإسلوب في تطبيقاتي بالنسبة لإنشاء حسابات للستخدمين فبعض تطبيقاتي أقوم بإستخدام الـ Hashing فيها لتخزين كلمات المرور في قاعدة بيانات الـ SQL Server بصورة رموز يصعب قراءتها و ليس بالضرورة استخدام نفس هذا الاسلوب الذي قمت بكتابته هنا لكن بإمكانك عمل اسلوب Method خاص بعملك.
لتجربته بإمكانك إستخدام Console App وتعرف متغيرات نصية والتأكد من عمل الإسلوبين بصورة جيدة.
أيضا في هذا الكتاب C# 7 in a nutshell ستجد العديد من المواضيع المرتبطة بالامتحان منها علي سبيل المثال التعامل مع الـ Garbage Collection وهو الذي يختص بالتعامل مع الذاكرة، ومن ميزات لغة الـ C# أنها تقوم بإدارة الذاكرة تلقائيا بدون التدخل من المبرمج، لكن بإمكان المبرمج التدخل وعمل تنظيف للذاكرة أينما رأى ذلك مفيدا في سرعة تطبيقه الذي عمل عليه. لو افترضنا لدينا فئة كالتالي:
class Customer
{
string Name { get; set; }
int Age { get; set; }
}
بإمكاننا إنشاء مثيل لتلك الفئة كالتالي:
Customer cus = new Customer();
cus.Name = "Mohammed";
cus.Age= 30;
بمجرد استخدام الكلمة المحجوزة new سيقوم المترجم بإنشاء المتغير cus في الـ Heap الخاص بالذاكرة بمعنى آخر بمجرد اردت التعامل مع الفئة Customer لن أقوم بإنشاء مثيل جديد في نفس الـ Thread بل سيقوم المترجم بإستدعاءه من الذاكرة، طبعا هذه العملية طويلة جدا وبإمكانها إضعاف اداء التطبيق في حال لم تكن هناك عملية GC حيث تتيح هذه الفئة مجموعة من الأساليب تساعد على عملية التنظيف وفقا لآلية معينة.
بإمكانك إستخدام الفئة WeakReference لمنع عملية الـ GC. وهذه الفئة من ضمن مواضيع الإمتحان – كان هناك سؤال عن هذه الفئة واجهني بالإمتحان,
بالتالي ستجد تلك الكتب مفيدة جدا.. وشخصيا كنت معتمد على كتاب Pro C# 6 and the .Net Framework 4.6 بصورة كبيرة جدا حيث كان كافي بالنسبة لي لتغطية جميع مواضيع الإمتحان ماعدا الجزء الثالث للإمتحان حيث كنت معتمد على كتاب C# 7 in a nutshell.
مواضيع الإمتحان بصورة سريعة
بإمكانك الدخول للرابط التالي وتنزيل وثيقة مواضيع الإمتحان…
https://www.microsoft.com/en-us/learning/exam-70-483.aspx
أولا: الـ MultiThreading وهو يعنى بإنشاء برمجيات تعمل بصورة غير متزامنة وبإمكانك استخدام كلمتي Async و await لتنفيذ البرمجيات بصورة غير متزامنة. في بدايات الدوت نت كان معظم المبرمجين يستخدمون Delegate لأنه بها مجموعة من الفئات والواجهات تساعدة على تنفيذ البرمجيات بصورة غير متزامنة.
ثانيا: طريقة سندلة الأخطاء والتعامل معها Exceptions ويتوجب عليك معرفة التعامل مع الاخطاء بالنسبة لفئات الشبكات وقواعد البيانات.
ثالثا: يتوجب عليك بصورة كبيرة معرفة التعامل مع الـ Validation من خلال مكتبة الـ Json (مجموعة كبيرة من أسئلة الامتحان كانت في هذا الموضوع بالإضافة للـ Serialization) أيضا يتوجب عليك قراءة مواضيع الـ Security والتعامل مع الـ Encrypt
رابعا: من المواضيع المهمة أيضا معرفة التعامل مع فئات الدوت نت من خلال الـ DLL وطريقة تثبيت المكتبات الخاصة بك كمبرمج داخل الـ GAC
خامسا: يتوجب عليك التركيز على تنفيذ جمل الإستعلام بالنسبة لقواعد البيانات عن طريقة الـ LinQ ويتوجب عليك معرفة الواجهتين الـ IEnumerable والـ IQuerable سواء من النوعين الـ non-Generic او من النوع Generic نسبة لأن التنفيذ على قاعدة البيانات دائما مايكون بعد إستدعاء أساليب الـ Extension Methods فرضا ToList( ) لو فرضنا مثالا بسيطا كالتالي:
String[] data = {“Mohammed”, “Ahmed”, “Hussien”, “Babiker”};
لو فرضنا لدي تلك المجموعة من البيانات من النوع النصي في صيغة مصفوفة، وأردت البحث عن كل فهرس من تلك المصوفة يحتوي على الحرف m لكن قبل عملية الـبحث. يتوجب علي إستدعاء جميع البيانات وبعد عملية البحث، فإذا قمت بإستدعاء ToList( ) قبل عملية البحث فلن أستطيع عمل بحث للفهارس المحتوية على حرف m.
سادسا: أيضا يتوجب عليك معرفة التعامل وكتابة جمل الإستعلام بالنسبة لملفات الـ XML ، أيضا الإمتحان يحتوي على مجموعة كبيرة من الأسئلة في هذا السياق ويرتبط معهُ بصورة مباشرة إستخدام الـ XmlSerialization التي تتيح لنا تخزين البيانات بصورة مؤقتة على ملفات XML.
سابعا: التعامل مع الأخطاء وتسجيلها في الـ Events Log الخاص بنظام التشغيل Windows من خلال الفئة EventLog فبإمكانك كتابة الشفرة التالية:
String yourLine = Console.ReadLind( );
EventLog el = new EventLog();
el.Source = “My Data”;
el.WriteEntry(yourLine);
في هذه الشفرة قمت بإعطاء اسم الـ EventLog – My Data وللتأكد من عدم وجودها بذلك الإسم يتوجب عليك إستخدام الـ Expression سواء من خلال if او Switch (بإمكانك النظر للصورة التي تظهر بعد الشفرة التالية التي توضح الإحدى عشر مصدر التي بإمكانك تخزين بياناتك عليها) ستكون الشفرة كالتالي:
if (!EventLog.SourceExists("My Data"))
{
EventLog.CreateEventSource("My Data", "Application");
}
هنا قمنا بإستخدام الاسلوب CreateEventSource ولديه معاملان Two Arguments الأول وهو الاسم الذي تود تعريف الـ Event عليه والمعامل الثاني هو المصدر الذي تود التخزين عليه (راجع الصورة بالأعلى لمعرفة جميع المصادر). من المهم جدا قراءة الجزء الخاص بالـ Implement diagnostic in an application نسبة لأهميته وأيضا توجد أسئلة متعددة تأتي في الامتحان.
سابعا: يتوجب عليك إنشاء تطبيق متكامل يتعامل مع قواعد البيانات تقوم من خلاله بإستخدام مجموعة من الطرق والتجريب عليه بإستخدام الـ Reflection والتي تعينك على إنشاء أو استدعاء الفئات من غير استخدام كلمة new او من غير إستدعاء الـ DLL وحفظها في الـ manifest الخاص بالتطبيق.
لدي تطبيق حجوزات ضخم جدا سأقوم بعرض المكتبة الخاصة بالـ Entity Framework من خلاله بإستخدام ILdasm.exe لرؤية جميع بيانات الـ manifest ومن خلال شاشة الـ manifest بإمكانك الضغط على Ctrl+m لعرض جميع الـ Classes والـ Interfaces والـ Events ومجموعة كبيرة من البيانات داخل مكتبة الـ Entity Framework
بضغطك على Ctrl+m داخل شاشة الـ manifest لمكتبة الـ Entity Framework سيأخد الـ ILdasm.exe فترة طويلة لعرض البيانات نسبة لكبر حجم مكتبة الـ Entity Framework
في الصورة التالية يظهر جميع تفاصيل الـ manifest من على أداة الـ ILdasm.exe
سؤال غريب: أيضا في الامتحان كان هنالك سؤال يطلب مني توضيح صحة اسلوب من عدمه Method من خلال الـ Unit Testing
لو إفترضنا لدينا اسلوب لجمع عددين كالتالي:
puplic int Add(int a, int b)
{
return a + b;
}
بالتأكيد هذا الإسلوب للمقاربة والتوضيح فقط للسؤال الذي واجهني في الامتحان لكن ليس هو السؤال نفسهُ.. فالسؤال كان يقوم بعرض Unit Test كالتالي:
[TestMethod]
Puplic void IS_AddMethod_ReturnInteger()
{
// Implementations goes here….
}
فكان السؤال غريب نوعا ما نسبة لأنه من ضمن مواضيع الامتحان لا يوجد الـ Unit Test، بالتالي خبرة المطور او المبرمج العملية تأتي هنا.
أخيرا:
الامتحان ليس بالشئ الصعب فقط يجب عليك تحديد الأدوات التي تساعدك على تخطيه. هناك بعض المطورين الذين جلسوا للامتحان ونجحوا فيه أكدوا لي إكتفائهم بالكتاب الرسمي (Programming in C# 70-483) للإمتحان والإعتماد عليه مع الدخول للـ Documentation الخاصة بمايكروسوفت.
تحياتي.
مقال جميل جدا ومفيد.. جزاك الله خير ونفع بك
طرح ممتاز،
بخصوص ال dumps ،
هل يوجد موقع معين تنصح به
أحسنت بارك الله فيــــــــك.