12/14/2013

مانشستر سيتي يصعق أرسنال


في واحدة من أقوى وأجمل مباريات الموسم، صعق فريق مانشستر سيتي ضيفه أرسنال وفاز عليه بستة أهداف مقابل ثلاثة اليوم السبت، في حين ضيّق تشلسي الخناق على أرسنال بتغلبه على كريستال بالاس بهدفين مقابل هدف وذلك في المرحلة السادسة عشرة من الدوري الإنكليزي الممتاز لكرة القدم.
وتجمّد رصيد أرسنال عند 35 نقطة في الصدارة أمام تشلسي الثاني (33 نقطة) وسيتي الثالث (32 نقطة).
على ملعب الاتّحاد، كان صاحب الأرض البادئ بالتسجيل بعد ركنية ومتابعة رأسية من الأرجنتيني مارتن ديميكيليس تابعها مواطنه سيرخيو أغويرو بيمناه في شباك الحارس البولندي فويسيتش شتشيني (14) رافعاً رصيده إلى 13هدفاً.
وانتزعت الكرة من الإيفواري يايا توريه عند خطّ المنتصف وارتدّ أرسنال في هجمة معاكسة وأرسلت الكرة الى الألماني مسعود اوزيل في الجهة اليسرى فأعادها خلفية إلى ثيو والكوت المندفع من الخلف وضعها بسهولة تامة من خارج المنطقة على يسار الحارس الروماني كوستا بانتيليمون مدركاً التعادل (31).
ولم تدم فرحة الضيوف طويلاً، وجاء الردّ حاسماً عندما مرّر توريه كرة إلى الأرجنتيني بابلو زاباليتا في الجهة اليمنى وعكسها عرضية أمام المرمى فتابعها الإسباني الفارو نيغريدو في الشباك وسط الزحمة العددية (39) مسجّلاً هدفه الشخصي السابع هذا الموسم.

وفي مستهلّ الشوط الثاني، أضاف البرازيلي فرناندينيو الهدف الثالث للفريق المحلّي بتسديدة من خارج المنطقة (50).
وكاد الفرنسي أوليفييه جيرو يأتي بالهدف الثاني لأرسنال بعدما تابع برأسه كرة رفعها مواطنه بكاري سانيا من الجهة اليمنى فابتعدت قليلاً عن القائم الأيمن (55)، وقلّص والكوت الفارق مجدّداً مستفيداً من كرة بينية أرسلها الويلزي آرون رامسي (63).
ومرّر الإسباني خيسوس نافاس بديل أغويرو كرة عرضية أمام المرمى سدّدها مواطنه دافيد سيلفا مباشرةً فاستقرّت في الشباك هدفاً رابعاً (66).
وأهدر الفرنسي سمير نصري بأنانيته فرصة هدف خامس لمانشستر سيتي حين فضّل المراوغة بهدف التسديد على التمرير إلى زميله توريه غير المراقب عند نقطة الجزاء وصاحب الهجمة في الأصل (78)، وتصدّى بانتيليمون ببراعة لقذيفة جاك ويلشير (79).
وسرقت الكرة مرّة جديدة من لاعبي أرسنال عند خطّ المنتصف وتبادلها فرناندينيو مع نصري الذي أعادها هذه المرّة إلى زميله تابعها البرازيلي فارتطمت بأسفل القائم الأيمن ودخلت الشباك هدفاً خامساً (88).
وشهدت الدقائق الخمس من الوقت بدل الضائع التي أضافها الحكم جنوناً عاصفاً، وكاد والكوت يكمل ثلاثيته عندما نفّذ ركلة حرّة من مكان مناسب أرسلها أرضية خطرة حولها الحارس ببراعة إلى ركنية (90+2)، وأرسل بكاري سانيا كرة عرضية إثر ركلة ركنية قصيرة سبح لها المدافع الدولي الألماني العملاق بير مرتيساكر وأودعها الشباك برأسه (90+4).
وحصل البديل جيمس ميلنر على ركلة جزاء إثر إعاقته من الحارس شتشيني نفّذها توريه على يساره مكمّلاً نصف الدزينة.
ورفع مانشستر سيتي رصيده إلى 32 نقطة بفارق نقطة خلف تشلسي، ونقطتين أمام ليفربول، الذي يلعب غداً في ضيافة توتنهام في آخر مباريات المرحلة.

12/10/2013

ما هي الكلمات المحجوزة في لغة ++ c

كلمات محفوظة من C + + قد تكون في وضع مريح الى عدة مجموعات. في المجموعة الأولى وضعنا تلك التي كانت أيضا حاضرة في لغة البرمجة C وتم ترحيلها إلى C + +. وهناك 32 من هذه، وهنا هم:


auto   const     double  float  int       short   struct   unsigned
break  continue  else    for    long      signed  switch   void
case   default   enum    goto   register  sizeof  typedef  volatile
char   do        extern  if     return    static  union    while




هناك آخر 30 الكلمات المحجوزة التي لم تكن في C، وبالتالي فهي جديدة لC + +، وهنا هم:

asm         dynamic_cast  namespace  reinterpret_cast  try
bool        explicit      new        static_cast       typeid
catch       false         operator   template          typename
class       friend        private    this              using
const_cast  inline        public     throw             virtual
delete      mutable       protected  true              wchar_t


 الكلمات المحجوزة التالية ليست ضرورية عند استخدام معيار مجموعة أحرف ASCII، ولكن تم إضافتها إلى توفير بدائل أكثر قابلية للقراءة لبعض من C + + المشغلين، وأيضا لتسهيل البرمجة مع مجموعات الأحرف التي تفتقر الأحرف التي يحتاجها C + + .


and      bitand   compl   not_eq   or_eq   xor_eq
and_eq   bitor    not     or       xor



نلاحظ أن المترجم معينة قد لا تكون تماما ما يصل إلى التاريخ، مما يعني أن بعض (وربما كثير) من الكلمات المحجوزة في المجموعتين السابقتين قد لا يتم تنفيذها حتى الآن.











What are reserved words in the language + + C

The reserved words of C++ may be conveniently placed into several groups. In the first group we put those that were also present in the C programming language and have been carried over into C++. There are 32 of these, and here they are:


break  continue  else    for    long      signed  switch   void
case   default   enum    goto   register  sizeof  typedef  volatile
char   do        extern  if     return    static  union    while



here are another 30 reserved words that were not in C, are therefore new to C++, and here they are

asm         dynamic_cast  namespace  reinterpret_cast  try
bool        explicit      new        static_cast       typeid
catch       false         operator   template          typename
class       friend        private    this              using
const_cast  inline        public     throw             virtual
delete      mutable       protected  true              wchar_t


The following 11 C++ reserved words are not essential when the standard ASCII character set is being used, but they have been added to provide more readable alternatives for some of the C++ operators, and also to facilitate programming with character sets that lack characters needed by C++.

and      bitand   compl   not_eq   or_eq   xor_eq
and_eq   bitor    not     or       xor



Note that your particular compiler may not be completely up-to-date, which means that some (and possibly many) of the reserved words in the preceding two groups may not yet be implemented.



كل ما تريد معرفته عن البرمجة سواء كنت مبتدئاً أو محترفا

كل ما تريد معرفته عن البرمجة سواء كنت مبتدئاً أو محترفا

 سأتطرق في هذه التدوينة لموضوع "البرمجة" ، لن نتعلم البرمجة فعليا ، لكن سنهيئ المبتدئين و الغير مبرمجين لدخول هذا الميدان بالطريقة الصحيحة ، و سنساعد المبرمجين ذوي الخبرة للتخلص من العادات السيئة و اكتساب عادات جيدة ، و طرق جديدة في التفكير البرمجي . الموضوع سيكون على شكل فقرات ، كل فقرة تجيب على أحد الأسئلة الآتية ، و هاته الفقرات ستكون مرتبة حسب تسلسل الأسئلة ، لنسهل عليك عزيزي القارئ الوصول لما تريده دون الاضطرار لقرائة المقالة كاملة .
كل ما تريد معرفته عن البرمجة سواء كنت  مبتدئاً أو محترفا

 1- ما هي البرمجة ؟2- ما هي اللغات البرمجية ؟3- كيف أختار لغة البرمجة التي تناسبني ؟4- كم من الوقت أحتاج لتعلم لغة برمجية ؟5- هل يمكن تعلم أكثر من لغة في نفس الوقت ؟6- هل أنتقل من لغة برمجية لأخرى ؟ 7-هل أداء البرنامج مهم ؟ 8-مشكلة عدم اكمال البرامج؟

 1-البرمجة ببساطة هي كتابة أكواد (دعنا نسميها حاليا أكواد) تطلب بها من الحاسوب القيام بأشياء معينة . هنالك من سيقول لي أستطيع فعل ذلك فقط بالفأرة و لوحة المفاتيح ، اذن سأطلب منه أن يفتح موقعا الكترونيا ، أول ما سيفعله هو فتح المتصفح و ادخال رابط الموقع ، لاحظ أنه قد فتح متصفحا و ذلك المتصفح هو ماطلب الموقع . المتصفح يسمى برنامجا ، أي أنه قد تمت برمجته (كتبت أكواده) ليطلب موقعا عند كتابة رابطه ، و نفس الشئ ينطبق على كل البرامج التي لديك .

 2- ما هي اللغة البرمجية ؟ أولا قبل أن أوضح ما هي اللغات البرمجية ، دعنا نسأل أنفسنا لما نحتاجها ؟ طبعا نحتاجها لنطلب من الحاسوب أن يفعل شيئا ، أي أننا نتحاور مع الحاسوب ، هنالك سؤال آخر يطرح نفسه ، ما هي اللغة التي يتكلمها الحاسوب ؟ أنا سأخبرك, الحاسوب يعرف شيئان فقط 1 و 0 ،أو ما يسمى بالنظام الثنائي ، فمثلا لو أردنا قول hello للحاسوب فعلينا كتابة 01101000 01100101 01101100 01101100 01101111 و هذا أمر صعب ، كأنك تحاول أن تكلم صينيا ، في هذه الحالة علينا أن نحظر مترجما ، لكن في العالم الافتراضي ، يجب أن تتحدث مع المترجم بلغته التي هي طبعا أسهل من لغة الحاسوب ، هنالك عدة مترجمات و بالتالي عدة لغات ، هذه اللغات هي لغات البرمجة . و كاضافة في هذه الفقرة ، سأوضح كيف نطلب من الحاسوب القيام بأمر عن طريق المترجم .

 3- كيف أختار لغة البرمجة التي تناسبني ؟ كما سبق أن قلت ، هنالك عدد من المترجمات ، و قلت أنه يوجد العديد من لغات البرمجة . هنا ، و كمبتدأ سترغب في اختيار أفضل لغة برمجية . لكن أنا سأقول لك لا توجد لغة أفضل من الأخرى ، لأنه قبل الخوض في ميدان البرمجة عليك أن تحدد ما الذي تريد أن تبرمج له ، حيث هنالك عدة مجالات ، فهنالك برمجة الويب أي المواقع و صفحات الانترنيت و قواعد البيانات ... ، هنالك البرامج المكتبية ، هنالك الألعاب ، هنالك الهواتف الذكية كالأندرويد و الأيفون ... لذلك و جب أن تختار المجال أولا ، بعد المجال وجب أن تبحث عن كل اللغات التي تشتغل فيه ثم بعد ذلك تبحث عن مميزات كل اللغة ، هنالك من لن يفهم ما أقصده بالمميزات ، لا بأس ، ما قصدته هو هل اللغة مفتوحة المصدر أم لا (أي يمكن الاطلاع عليها و كيف تمت كتابتها) ، ما هي المنصات التي تشتغل عليها هذه اللغة أي ما هي أنظمة التشغيل التي تشتغل عليها ، مدى سهولة اللغة ، مدى طلب اللغة في الشركات و الأسواق ...، للاشارة فقط ، يمكن أن تكون لغة واحدة في عدة مجالات ، فمثلا يمكن أن تبرمج بلغة جافا برامجا مكتبية و مواقع انترنيت و ألعاب و كذلك تطبيقات الأندرويد .

 4- كم من الوقت أحتاج لتعلم لغة برمجية ؟ عملية التعلم ليست محصورة بوقت معين ، لكن حاول أن تعطي للغة وقتا كافيا حتى تحس أنك أتقنت الأساسيات و من الضروري جدا أن أن تطبق ما تعلمته حتى و لو كان بسيطا و تراه سخيفا . فرضا أن لدينا متعلمين اثنين ، الأول تعلم لغة ما في أسبوع و بدأ في بناء برمجياته، بينما المتعلم الثاني أخذا مدة شهرين أو ثلات في تعلم الأساسيات ، صدقني أن المتعلم الثاني سيبني برامج أفضل و أقوى من الأوول ، و للاشارة اللغات البرمجية تختلف أي أن مدة تعلم كل واحدة ستختلف عن الأخرى .

 5- هل يمكن تعلم أكثر من لغة في نفس الوقت ؟ هذا أحد أكبر الأخطاء الذي يقع فيه الكثيرون و خصوصا الجدد في البرمجة . و سأقول لك لماذا . أولا أنت حددت المجال الدي ترغب في البرمجة فيه (الفقرة الثالثة) ، و اخترت اللغة البرمجية ، اذن ما الحاجة للغة أخرى ؟؟!! ثانيا قد تبدأ في الخلط بين syntax هذه اللغة و اللغة الأخرى . ثالثا عملية التعلم ستكون أبطأ. اذن الجواب هو لا ، لا تحاول تعلم عدة لغات برمجية في نفس الوقت.

 6-هل أنتقل من لغة برمجية لأخرى ؟ يمكن أن يكون خطأ فادحا و مضيعة للوقت أو تطورا و زيادة في المعرفة و المهارات . الانتقال من لغة لأخرى من الأمور التي يجب الحذر فيها ، حيث لو تعلمت لغة برمجية لا يجب الانتقال للغة أخرى الا اذا أتقنت الأولى و بنيت بها برامج ، بعد ذلك ستجد أن اللغة الأخرى سهلة سيكون الاختلاف في طريقة كتابة اللغة Syntax و طبعا سيزداد عليها بعض التغييرات حسب المجال ، لكن ستجد أنه من السهل التعامل مع اللغة الجديدة . لذلك احرص أن تبني برامج باللغة الأولى قبل الانتقال للغة ثانية و الا فستكون قد ضيعت و قت تعلم اللغة الأولى هباءًا.

 7-هل أداء البرنامج مهم ؟ كبداية ، سواء كنت مبتدئا أم محترفا فأداء البرنامج ليس مهما في البداية ، حيث أول ما يجب فعله هو بناء البرنامج ، و عندما أقول بناء البرنامج يجب أن يكون مكتوبا بطريقة منظمة لأنه تنظيم البرنامج و امكانية قراءة الكود المصدري الخاص به يعد نجاحا في الأداء ، لأنه سيسهل بعد ذلك التحليل ، و بالتالي ايجاد طرق لتقليل استهلاك الذاكرة ، بناء واجهة بسيطة ، ايجاد الأخطاء المنطقية ، ايجاد الثغرات ... المهم هو أن تنسى الأداء و الثغرات و التركيز على تنظيم الكود و سهولة قرائته في البداية ، ثم بعد اكمال البرنامج ، الاهتمام بالأداء.

 8-مشكلة عدم اكمال البرامج؟ هذه احدى المشاكل التي يعاني منها الكثير من المبرمجين و خصوصا مبرمجي الويب الذين يحاولون الوصول لبرامج تنافس برامج قوية كسكربت جوملا أو في بي ... لذلك كنصيحة مني ، ابدأ البرنامج بأقل الامكانيات ليشتغل ، أي يجب أن لا تتعمق في البرنامج في البداية و أن تكتبه ليشتغل في البداية فقط ، و أهم شيئ هو أن يكون الكود منظما ، و البارامترات و الدوال تأخد أسماء تناسبها و ليس أسماء عشوائية ، و أفضل الأسماء هي تلك التي تدل على عمل الدالة أو الكلاس أو البارامتر مع كتابة الملاحظات لأنه أمر مهم جدا . إلى هنا أودعكم و أرجو الله أن تكون قد أعجبتكم تدوينتي ، و ان أعجبتك لا تترد في نشرها لأعطي نصائح أخرى خصوصا للمتقدمين في البرمجة لأني ركزت أكثر على المبتدئين و الجدد .

The most important program areas where we need to Mathematics



In this article I intend to present programming as a mathematical activity without undertaking the arduous task of supplying a definition of "mathematics" pleasing all mathematicians, nor of defining "programming" in a way that is palatable to all programmers.

With respect to mathematics I believe, however, that most of us can heartily agree upon the following characteristics of most mathematical work:

Compared with other fields of intellectual activity, mathematical assertions tend to be unusually precise.
Mathematical assertions tend to be general in the sense that they are aplicable to a large (often infinite) class of instances.
Mathematics embodies a discipline of reasoning allowing such assertions to be made with an unusually high confidence level.
The mathematical method derives its power from the combination of all these characteristics; conversely, when an intellectual activity displays these three characteristics to a strong degree, I fell justified in calling it "an activity of mathematical nature", independent of the question whether its subject matter is familiar to most mathematicians. In other words, I grant the predicate "mathematical nature" rather on the "quo modo" than on the "quod".

A programmer designs algorithms, intended for mechanical execution, intended to control existing or conceivable computer equipment. These -usually electronic- devices derive their power from two basic characteristics. Firstly, the amount of information they can store and the amount of processing they can perform in a reasonable short time are both large beyond imagination. And as a result, what computers could do for us has outgrown its basic triviality by several orders of magnitude. Secondly, as executors of algorithms, they are reliable and obedient, again beyond imagination: as a rule they indeed behave exactly as instructed.

This obedience makes heavy demand on the accuracy with which the programmer has instructed the machine; if the instructions were to produce non-sense, the machine will produce non-sense. Inexperienced programmers often blame the machinery for its strict obedience, for the impossibility to appeal to the machine's "common sense"; more experienced programmers realize that it is exactly its strict obedience that enables us to use it reliably, to forge it into a sophisticated tool that we would never be able to build if the executor of our algorithm had the uncontrolled freedom to interpret our instructions in "the most plausible way". As a result, the competent programmer does not regard precision and accuracy as mean virtues: he knows that he could not work without them.

His work is also always "general" in the sense that each program is able to evoke as many different computation as we can supply it with different input data. Whenever we make an assertion about a program, it is an assertion about the whole class of possible computations that could be evoked under control of it and "designing an algorithm" is nothing more nor less than "designing a whole class of computations". So the programmer's work also shares the second characteristic.

Finally, what about the confidence level of his work? Well, it should be very high for two reasons. Firstly, a large sophisticated program can only be made by a careful application of the rule "Divide and Conquer" and as such consists of many components, say N; if, however, p is the probability of an individual component being correct, then the probability P of the whole aggregate being correct satisfies something like P ≤ pN. In other words, unless p is indistinguishable from 1, for large N the value P will be indistinguishable from zero! If we cannot design the components sufficiently well, it is vain to hope that their aggregate will work at all. Secondly, its confidence level should be very high if we, as society, would like to rely upon the performance of the algorithm. And we do, when we use machines for air traffic control, banking, patient care in hospitals or earth-quake prediction.

Now honesty compells me to admit that today, on the average, the confidence level reached by the programming profession is not yet what it should be, on the contrary!

From a historical point of view this sorry state of affairs is only too understandable. The tradition of programming is very young and has still many traceable roots in the recent past, when machines were still rather small and programming was not yet such a problem. (Before we had machines, programming was no problem at all!) But in the last ten to fifteen years, the power of available machinery has grown at least with a factor of a thousand, thereby completely changing the scope of the programming profession. But old habits seldom die!

The old technique was to make a program and then to subject it to a number of testcases where the answer was known; and when the testruns produced the correct result, this was taken as a sufficient ground for believing the program to be correct.

But with growing sophistication, this assumption proved more and more to be unjustified until, some five years ago, it surfaced in the form of "the software crisis". One of the first considerations of what was later to emerge as "programming methodology" was this question of the confidence level: "How can we rely on our algorithms?"

An analysis of the situation quite forcibly showed that program testing can be used very convincingly to show the presence of bugs, but never to demonstrate their absence, because the number of cases one can actually try is absolutely negligible compared with the possible number of cases. The only way out was to prove the program to be correct.

The suggestion that the correctness of programs could and should be established by proof was met with a great amount of scepticism. (In the mean time, many older people had already accepted as a Law of nature, that each program is bound to contain bugs!) The skepticism, however, was not without reason.

To start with, it was not clear what form such correctness proofs could have. You cannot build a proof on quicksand, you must have axioms, in this case an axiomatic definition of the semantics of the programming language in which the program has been expressed. It was only after a few efforts that a technique for semantic definition emerged that could serve as a possibly practical staring point for correctness proofs.

When people then tried to give correctness proofs for existing programs, the result of that effort was very disappointing: the proofs were so long, hairy and clumsy, that they failed to convince. And also this disappointment can still be traced in the scepticism of many. But three discoveries have changed the scene since them.

The first discovery was that the amount of formal labour, needed to prove the correctness of a program could depend very heavily on the structure of the program.

The second discovery was that of a few useful theorems about program constructs and thanks to them we no longer need to go all the way back to the axioms all the time.

The most drastic discovery, however, was the last one, that what we then tried, viz. to prove the correctness of a given program, was in a sense putting the cart before the horse. A much more promising approach turned out to be letting correctness proof and program grow hand in hand: with the choice of the structure of the correctness proof one designs a program for which this proof is applicable. The fact that then the correctness concerns turn out to act as an inspiring heuristic guidance is an added benefit.

If I ended this article with the above optimistic note I could create the wrong impression that now the intrinsic difficulties of programming have been solved, but this is not true: the best I can say is that now we have a better insight in the nature of the difficulties of the programming task than a few years before. In my closing paragraphs I hope to convey this nature, at the same time sketching the intellectual demands made upon the competent programmer.

A programmer must be able to express himself extremely well, both in a natural language and in the formal systems. The need for exceptional mastery of a natural language is twofold. Firstly it is not uncommon that e.g. English is the language in which the problem is communicated to him and in which he must describe his interpretation or modification of the problem. This circumstance has been a source of many misunderstandings to the extent that there is a wide-spread belief that e.g. English by its very nature is inadequate for the communication task. I don't believe it (although sloppy English certainly is!), on the contrary: I always have the feeling that our natural language is so intimately tied with what we call understanding that we must be able to use it to express what we have understood. Secondly, we should not close our eyes for the fact that formalization, in a sense, is always "after the fact" and that therefore natural language is an indispensable tool for thinking, in particular when new concepts have to be introduced. And this is what a programmer has to do all the time; he has to introduce new concepts --not occurring in the original problem statement-- in order to be able to find, to describe and to understand his own solution to the problem. For instance, when asked to construct a detector, analysing a string of characters for the occurrence of an instance of the --nicely formally described-- syntactic category "sentence", he may find himself led to the introduction of a completely new syntactic category "proper begin of a sentence", i.e. a string a characters that is admissible as the opening substring of a sentence but not yet a complete sentence itself. After having established that this is indeed a useful concept for the characterization of some intermediate of the computational process, he will proceed by manipulating the given formal syntax in order to derive the formal definition of this new syntactic category. In other words, given the problem, the programmer has to develop (and formulate!) the theory necessary to justify his algorithm. In the course of this work he will often be forced to invent his own formalism.

Such demands, of course, are common to most mathematical work, but there are reasons to suppose that in programming they are more heavy than anywhere else. For besides the need of precision and explicitness, the programmer is faced with a problem of size that seems unique to the programmer profession. When dealing with "mastered complexity", the idea of a hierarchy seems to be a key concept. But the notion of a hierarchy implies that what at one level is regarded as an unanalyzed unit, is regarded as a composite object at the next lower lever of greater detail, for which the appropriate grain (say, of time or space) is an order of magnitude smaller than the corresponding grain appropriate at the next higher level. As a result the number of levels that can meaningfully be distinguished in a hierarchical composition is kind of proportional to the logarithm of the ratio between the largest and the smallest grain. In programming, where the total computation may take an hour, while the smallest time grain is in the order of a microsecond, we have an environment in which this ratio can easily exceed 109 and I know of no other environment in which a single technology has to encompass so wide a span.

It seem to be the circumstance sketched in the above paragraph that gives programming as an intellectual activity some of its unique flavors. The concepts he introduces must be highly effective tools for bringing the necessary amount of reasoning down to an amount of reasoning that can be done. And also the formalism he chooses must be such that his formulae do not explode in length, a regrettable phenomenon that is bound to occur unless the programmer pays conscious care to measures for avoiding that explosion. A final consequence of the hierarchical nature of his artefacts is the competent programmer's agility with which he switches back and forth between various semantic levels, between global and local considerations, between macroscopic and microscopic concerns, an ability that has been described as "a mental zoom lens". This agility is bewildering for those that are unaccustomed to it.

If --and I hope that I am fair-- I confront with this with my impression of "the standard mathematical curriculum" (whatever that may be), I come to the following differences in stress:

In the standard mathematical curriculum the student becomes familiar (sometimes even very familiar!) with a standard collection of mathematical concepts, he is less trained in introducing new concepts himself.
In the standard mathematical curriculum the student becomes familiar (sometimes even very familiar!) with a standard set of notational techniques, he is less trained in inventing his own notation when the need arises.
In the standard mathematical curriculum the student often only sees problems so "small" that they are dealt with a single semantic level. As a result many students see mathematics rather as the art of organizing their symbols on their piece of paper than as the art of organizing their thoughts.
If I have given some of my readers the first germs of the feeling that to an inventive and effective mathematician the field of programming may provide the area par excellence in which to find his challenge and bring his abilities to bear, one of my dearest wishes has been fulfilled.

أهم المجالات البرمجية التي نحتاج فيها للرياضيات؟

أهم المجالات البرمجية التي نحتاج فيها للرياضيات هي
  • الألعاب، البرامج التي يستخدمها المهندسون المعماريون والمهندسون المدنيون. في أغلب الأحيان هذه البرامج تتطلب من المبرمجين معرفة جيدة بالهندسة في الفضاء إضافة إلى بعض القوانين الفيزيائية خصوصا قوانين الحركة.
  • الذكاء الاصطناعي، النمذجة Modernization والمحاكاة. وذقد عملتُ شخصيا على أحدها لمدة ستة أشهر. الرياضيات المستخدمة هنا غالبا ذات علاقة بالاحتمالات (سلاسل ماركوف، قوانين بايس على سبيل المثال)
  • برمجة العتاد بشكل عام وخصوصا في معدات الشبكات (Routers, switches, ...).
-الأنظمة المتوازية وإدارة الموارد.
أذكر هنا قصة أوردها لنا أحد الأساتذة قال إن أحد تلاميذه أجرى تدريبا في إدارة المستشفيات الفرنسية بباريس بداية التسعينات حيث كانوا يستخدمون برنامجا لإدارة دوريات الإسعاف التابعة لهم. المتدرب لاحظ أنه بالاستفادة من إحدى خواص المخططات graphes يمكن تسريع أداء البرنامج حيث كان يتطلب 3 أسابيع من العمل للحصول على تنظيم الفترة القادمة من عمل الدوريات وأصبح لا يتعدى الثلاثة أيام,
بعد هذا أستطيع أن أجيب على السؤال "هل ترى الرياضيات مهمة ؟" بنعم. وستكون الإجابة بضرورية جدا إن كنت تعمل في أحد المجالات التي ذكرتُها. بالنسبة لبرمجة المواقع لا أظنها تحتاج كثيرا من الرياضيات، مستوى الثانوية بنظري يكفي.

12/08/2013

خمس افكار مجربة لتكون مثل نجوم البرمجة

١- طبق مبادئ البرمجة الوظيفية Functional Programming

تعلم مبادئ البرمجة الوظيفية حتى اذا كنت مقتنع بانماط اخرى للبرمجة (مثل البرمجة الموجهة للكائنات Object Oriented Programming) فيسختلف اسلوبك و جودة الكود الذي تنتجه تماماً بعد فهمك للمبادئ العامة و الاتجاهات الفكريه التي تحكم البرمجة الوظيفية، عالم مثير و شيق من الافكار الجديدة عليك و التي ستغير طريقة تفكيرك الى الافضل بالتأكيد.
المثير في الامر انه في الاونه الاخيره انتشرت لغات البرمجة الوظيفية التوجه بشكل كبير جداً و اصبحت اخر صيحه في موضة لغات البرمجة بعد ان ظلت لسنوات طويله مشهوره بأنها لغات اكاديميه بحته لا تصلح للبرمجيات العمليه في الصناعة، لذا من الممكن ان دراستك لهذه المبادئ ان تشجعك لدراسه لغه من لغات البرمجة الوظيفية لتواكب موضة لغات البرمجة و تنافس نجوم البرمجة في العالم!
شفافيه المرجعية (Referential Transparency) من المبادئ الهامة في البرمجة الوظيفية Functional Programming و التي تعني ان الدوال (Functions) تنتج نفس النتيجة عند كل مره يدخل لها نفس المعطيات (arguments) بغض النظر عن متى و اين تم استخدام تلك الداله، و الذي يعني عدم الاعتماديه على الحالة المتغيره للكائنات او التغيرات (mutable state) و هو الامر الاهم في لغات البرمجة الوظيفية، تفادي المتغيرات المشتركة (الحالة المتغيره mutable variables/state).
ستشعر بقيمة هذا التوجه اذا كنت من مستخدمين نظام “البرمجة المبنيه على الاختبار” و هو اسلوب في البرمجة يعتمد على كتابه اختبارات للكود المطلوب كتابنه قبل كتابته و يسمى بالانجليزية Test Driven Development TDD و في هذا النظام يكون عليك فصل مكونات البرنامج الى قطع صغيره يسهل اختبارها بواسطه اكواد اختبار للوظائف (Unit Tests) و هذا يجبرك ان تكون عمارة البرامج مبنيه على شفافيه المرجعية حتى يتسنى لك عزل جزء معين و اختباره بشكل منفصل. اذن فمبدأ الشفافية المرجعية يساعدك على كتابه كود اكثر اختبارية و اوضح في الاستخدام و “متوقع”!
بالتأكيد هذا المبدأ لا يصلح في كل الاحوال و يجب ان تراعى مبادئ البرمجة الكائنية بشكل واضح لكن مع فهمك للموضوع بشكل عملي ستستطيع ان تحدد متى و كيف يمكن تطبيق هذا المبدأ بشكل يجعل البرنامج مُصمم بشكل اكثر استقلاليه و كل المكونات مستقله و متفاعله بشكل مرن

٢- إسأل دائما “ماذا كان ليفعل المستخدم هنا؟” فأنت لست المستخدم

من المواضيع الهامة جداً الاهتمام بالمستخدم فتذكر دائماً انك تفكر بمخ المبرمج و ليس المستخدم فهناك فارق كبير بين المستخدم و المبرمج (المطور) و هذا الفارق يكمن في ان هناك العديد من الاشياء يعتبرها المبرمج من “البديهيات” او من الامور الواضحة و التي لا تحتاج للتوضيح في حين ان المستخدم يرى الامور من زاوية اخرى. ايضآً من الامور الهامة هي ان المبرمج يريد ان يظهر كل امكانيات البرنامج و ذلك قد يتم بطريقة قد تربك المستخدم بسبب وضع كل خصائص البرنامج في مكان واحد او محاولة وضع كل ما يخطر على بال المبرمج من خصائص او مميزات جديدة بدون دراسة ما يريده المستخدم. لحل هذه المشكلة فكر بشكل ابسط و اسأل عينه حقيقية من مستخدمين محتملين عن كل ما يدور في خاطرهم و اسألهم عن ما اذا كانت المميزات التي تفكر في دمجها في برنامجك هي “اساسية” لهم ام لا.

٣- لا تتعلم لغة البرمجة فقط لكن تعلم الثقافة المحيطة بها

في بعض اللغات قد يكون طبيعياً و منطقياً ان تجد الكثير من الدوارات (loops) لكن ستجد نفس الكود يثير الدهشه و الانتباه اذا كتبته في لغة برمجة مختلفه، لأن في اللغة الثانيه السائد هو استخدام ال recursion، اذا كنت واحداً من الذين يكتبون نفس نمط و اسلوب الكود في كل لغات البرمجة فأنت بحاجة ماسة الى تلك النصيحة.
لغات البرمجة كاللغات الحية، يحيط بها ثقافه و عادات و تقاليد. كل لغة لها اسلوبها البلاغي في التعبير و تستطيع ان ترى هذا بوضوح في اللغات الحية، فمثلاً قراءة القرآن الكريم باللغة العربية تختلف تماماً عن اي نسخة مترجمة الى اي لغة اجنبيه، كذلك اي كتاب ادبي فرنسي له طعم آخر اذا استطعت ان تقرأه بالفرنسيه و ليس مترجم. في كتاب The Pragmatic Programmer ينصحنا “اندي هانت” و “ديف توماس” ان نتعلم لغة برمجة جديدة كل عام، لا تستسلم لنفسك و انت تحاول ان تكتب اكواد طويلة و دوال static كثيره و تبعد عن البرمجة الكائنية التوجه في لغة جافا لأنك قادم من ثقافة لغة ال C، عندما تتعلم لغة برمجة، احتضنها و تعلم و افهم الثقافة المحيطة بها. احياناً يكون من الممتع جداً ان تفهم الاسباب وراء تطوير اللغة بهذا الشكل من احد مطوريها و يغير هذا في طريقة تفكيرك و تعبيرك في هذه اللغة لتصبح في النهاية كالشعراء يستخدم افضل ما في اللغة للتعبير عن افكاره
الفائدة الاكثر اهمية هي انك بعد ان تتعلم عدة لغات ستجد نفسك تكتب اكواد بشكل مختلف تماماً في اللغات التي كنت تتقنها قبل ان تتعلم غيرها، سيتكون لديك حس راقي في الكتابه و ذوق يمزج افضل ما تعلمته في كل لغة من اللغات لكن بثقافة الغة التي تكتبها، انه امر حقاً ممتع.

٤- الجمال في البساطة

في بداية دراستي لهندسة البرمجيات كنت استمتع جداً بتصميم برامج معقدة بها كل ما تتخيله من امكانيات و كان هذا من منطلق ان هذا هو الذكاء. الذكاء هو ان تصنع برمجيات معقدة لأنها صعبة و المهندسون يحبون الاشياء الصعبة لأنها تمتحن قدراتهم، لكن سرعان ما اكتشفت خطئي في كل ما كنت احاول ان افعل. فالحقيقة ان البساطة اجمل و ايضاً اصعب!
تصميم برمجيات بسيطة و جميله قد يبدو شئ شديد السهوله إلا انه في الحقيقة غاية في الصعوبه، صعوبه البساطة في انها تجعلك تختار بين اختيارات صعبه فأنت لا تستطيع ان تضع كل افكارك، لكن يجب ان تختار الاجمل و الاكثر فاعلية. اصعب ايضاً لأن تفكيرك يجب ان يكون ابعد ما يكون عن التفكير التقني البحت، الذي يجعلك محبوس داخل هذا العالم من الاكواد و الذي لا يهم المستخدم على الاطلاق، فالمستخدم يهمه شئ واحد، ان يقدم البرنامج ما “يحتاج” و ليس ما انت تستطيع ان تقدمه!
البساطة لا تكمن في الواجهات الخارجية او الواجهات البرمجية للبرامج لكن تبدأ من البساطة في الداخل، بساطة تصميم الاكواد و الكائنات و الدوال، مدى وضوح الكود للقراءه، مدى سهوله صيانه الكود في المستقبل. اسهل ما يكون ان تكتب برامج معقدة و اصعب ما يكون ان تكتب برامج جميله من الداخل الى الخارج و بدون تعقيد.

٥- تأكد من الكود الخاص بك قبل ان تلوم الآخرين

في اغلب الاوقات ستجد نفسك تلوم بيئة العمل انها سبب المشكله التي تواجهك او نظام التشغيل و احيانا ال compiler و ستلعن اكواد الاخرين من النظرة الاولى و سترى دائماً ان الكود الخاص بك هو اجمل و اكمل ما يكون و لا يمكن ان يكون به مشكله….في الحقيقة ان تريد ان تفيق من احلامك :)
اكثر من ٩٠٪ من المرات التي رأيت فيها اشخاصاً يزعمون ان الخطأ الذين يواجهونه بسبب اكواد اناس اخرين، كانوا مخطئين! في الحقيقة النسبة اكثر من هذا لكن هؤلاء هم من لديهم الشجاعة بالاعتراف :)
تذكر دائماً هذه النصيحة و اجعل اخر ما تفكر فيه هو اكواد الاخرين لأن هذا يشتت تفكيرك عن النظر في الكور الخاص بك و سيجعلك تشعر بالخجل عندما يأتي احدهم ليقول لك ان الخطأ في الكود الخاص بك و يستطيع اثبات ذلك في ثواني، لأنك ببساطة انشغلت عن مراجعة عملك و رميت كل الخطأ على الآخرين. تذكر انه حتى في اكثر الامور التي قد تبدو غير معقوله على الاطلاق، قد يكون هذا خطؤك.

ماهي الفائدة من اتقان البرمجة؟

في المرحلة الجامعية تعاملت مع عدة لغات برمجية ربما 6 او اكثر بحكم انني درست هندسة الحاسوب ولكن كان ذلك بشكل سطحي جداً, لغة الـ C# هي أكثر لغة أحببتها من هذه اللغات لكنني تجاهلتها وذهبت لتعلم لغة الـ PHP وأكملت مسيرتي البرمجية معها.
واخذت التوسع فيها والعمل بها لمدة طويلة من الزمن وتعلمت استخدام اكثر من منصة عمل وكنت دائماً ارفض فكرة تعلم لغة برمجة اخرى,
وعندما كنت أسال لماذا تعتبر PHP أفضل من ASP كنت أجاوب عن طريق سرد مزايا ومحاسن الـ PHP متجاهلاً أصل السؤال والذي الهدف منه المقارنة.

فيما بعد سمعت عن منصة العمل لارافل وسمعت انها اصبحت منصة العمل رقم 1 مع العلم انها من منصات العمل الجديدة فقمت بتعلمها وقراءة التوثيق الخاص بها وأيضاً عدة كتب تتحدث عنها وأعجبت كثيراً بها ووجدت انها نقلة نوعية في عالم البرمجة..
مؤسسها Taylor Otwel الأن يعتبر شخصاً معروفاً جداً في عالم الـ PHP أعتقد ان المبرمجين الذين يعرفون قصة حياته هم أكثر عدداً من أولئك الذين يعرفون اسم مخترع لغة الـ PHP حتى !!,
وجدير بالذكر ان مؤسس منصة العمل هذه Taylor Otwel هو مبرمج .NET في الأصل لكنه انتقل حديثاً الى الـ PHP.
فيما بعد شعرت ببعض الحنين الى لغة الـ C# وقررت أن أتعلم الـ ASP MVC بإستخدام لغة الـ C# والإصدار الرابع من MVC تحديداً, عندها اكتشفت اكتشاف مهم جداً, إكتشتفت ببساطة ان التعامل مع ASP MVC هو اسهل بكثير من التعامل مع منصة العمل Laravel والذي يعتبر أفضل منصة عمل للغة الـ PHP كما ذكرت سابقاً, لكن الشيء الذي أدهشني فعلاً هو أن Taylor Otwel و إختراعه العظيم Laravel ماهو إلا محاولة لتقليد ASP MVC, نعم وببساطة Laravel هو محاكاة لـ ASP MVC في لغة الـ PHP ليس أكثر ..
هل يجب عليك تعلم أكثر من لغة برمجة ؟
أعتقد أن جواب السؤال قد وصل إليك بوضوح, Taylor حصد نجاح كبير وأصبح من الأسماء اللامعة جداً في عالم الـ PHP كل هذا كان بفضل إتقانه لأكثر من لغة برمجة !!!
ومن وجهة نظري (الجديدة) نعم يجب عليك تعلم أكثر من لغة برمجة ولكن يجب عليك أن تقضي من سنة إلى سنتين على الأقل مع لغة برمجة واحدة.
تنويه : في هذه المقالة أنا لا أحاول أن أقلل من مجهود Taylor Otwel فمجرد فكرته حول نقل الإبداع الموجود في ASP إلى PHP تعتبر فكرة مميزة ومبتكرة بالإضافة إلى أن عملية النقل هذه لم تكن بالأمر السهل وإحتاج إلى الكثير من الأفكار المميزة ليتمكن من تنفيذها

افضل طريقة لدخول عالم البرمجة

ما هي افضل لغة برمجة ؟ هذا هو عنوان موضوعنا اليوم ، و لعل اغلب من يريد التمرس في عالم البرمجة يراوده هذا السؤال و يلاحقه في احلامه ، فقد يبدأ في تعلم لغة برمجية معينة و بعد ذلك يكتشف انها كانت خيارا خاطئا ، ثم يجرب من جديد لغة اخرى و يكتشف انها ليس مناسبة ايضا ، و هكذا يبقى يدور في حلقة مغلقة من التجارب الفاشلة ، لذلك ساتطرق في هذا الموضوع  لمجموعة من العوامل التي تساعدك على اختيار اللغة البرمجية التي تناسبك .
ففي الحقيقة ليس هناك بتاتا لغة برمجة افضل من الأخرى و لكن يمكن تحديد لغة برمجة التي تناسبك و ذلك من خلال مجموعة من المعيايير هي :
ما هو صنفك البرمجي ؟
لعل من اهم الأشياء التي تساعدك على تحديد لغتك البرمجية هي صنفك البرمجي ، فالبرمجة تنقسم الى صنفين اما برمجة الويب او برمجة البرامج ، فيجب عليك هنا ان تحدد ميولك الشخصي ، هل تريد صناعة مواقع ؟ ام تريد صناعة برامج ؟ و بالتأكيد رغبتك في دخول عالم البرمجة كانت مبنية على رغبة كبيرة في الوصول الى شيء معين او بالأحرى انطلاقا من تسائل معين ، فقد يكون سبب دخولك لميدان البرمجة مبني على سؤال : كيف صنع الفايسبوك ؟ او على سؤال كيف تصنع برامج الحماية ؟ و انطلاقا من هذه الرغبة او من هذا التسائل بمكنك تحديد صنفك البرمجي
فلو كنت تريد التمرس في برمجة الويب فليس لديك خيارات كثيرة :
1- تعلم الـ HTML و Css
2- تعلم احدة اللغتين ال php أو الـ Asp ، انصك بتعلم الـ asp لكن في المقابل عليك دفع مبلغ لـ Microsoft لنشر مواقعك المبرمجة بها غير ذلك فالأفضل هي الـ php لأنها بسيطة و جميلة و مفتوحة المصدر
3- تعلم الـ Javascripte
اما اذا كنت تريد التمرس في برمجة البرامج فتابع المعايير القادمة
ما هو هدفك من البرمجة ؟
تعم ان هدفك في البرمجة يحدد بطريقة مباشرة اللغة البرمجية التي تناسبك . فما هو هدفك من البرمجة ؟
اغلب من يدخل ميدان البرمجة فهو يدخلها لهدفان لا ثالت لهما. و هما :
  • الاستمتاع بالبرمجة لأنك تجدها ممتعة و تعشق التحديات ( هنا تسمى انت بهاوي )
  • الرغبة في الاحتراف و اتخاد البرمجة كعمل (تسمى هنا بمحترف )
فلغات البرمجة منها الصعبة و الاحترافية و منها السهلة و البسيطة لكنها غير احترافية ، اي انك لو كنت هاوٍ فعليك اختيار اللغة البرمجية الأكثر سهولة التي توفر لك كل متطلبات برمجة برامج بسيطة فقط حسب امكانياتك و ظروفك (وقت فراغك ) اما لو كنت ترغب في الاحتراف فعليك اختيار لغات البرمجية الصعبة الاحترافية التي تمكنك من التعامل مع مختلف مكونات الحاسوب المرنة و الصلبة ، و تستطيع من خلالها برمجة اي شيء يخطر على بالك انطلاقا من مؤهلاتك و تكريش وقتك
اما اللغات البرمجية التي انصح بها الهواة فهي : Vb6 - Pascal - Go - Windev
رغم ان هناك البعض من سيعارضني بخصوص الـ Windev لانها لغة تبسيط اكثر مما هي لغة هواية
اما اللغات البرمجية الاحترافية و التي تحتوي على تقنيات عالية : C++ C Delphi Vb.net C# Java
و غيرها من اللغات
الآن لو كنت هاوي فلديك خيارين البرمجة بالكود فقط انصحك باختيار الـ Pascal او البرمجة بتقنية الـ Rad (سحب جر ) انصك بالـ
Vb6و لو انت تريد الاحتراف فتابع المعيار الثالت .

ما نوع البرامج الي تريد برمجتها ؟
تحدثنا في النوع الأول عن الصنف اما الآن فسنتحدث عن نوع البرامج التي تريد برمجتها
فالبرامج انواع كثيرة فنحن نجد على الحاسوب العابا و برامج مكتبية و تطبيقات و برامج تسيير و برامج حماية و الكثير من الأشياء الاخرى
فاعتمادا على نوع البرامج التي تريد برمجتها تحدد لغتك البرمجية
فلو كنت تريد التمرس في صناعة الألعاب فلديك خيارات محدودة هي C# و ++C و Java هذا لا يعني ان اللغات الاخرى لا يمكن صناعة العاب بها ، و لكن هذه اللغات احترافية في صناعة الألعاب فالـ ++C متلا توفر لك تعامل مثالي مع الـ OpenGL لصناعة الالعاب ، و يمكنك اختيار اي لغة انطلاقا من درجة الصعوبة ، فلو كنت تريد صعوبة اكثر توجه الى الـ ++C و اقل C# و Java
مع مراعات علاقة الصعوبة بمدى الاحترافية .
اما لو كنت صناعة برامج تطبيقية مكتبية عادية مثل برنامج تحويل العملات ، او برنامج قارئ PDF و الكثير من البرامج التطبيقية الأخرى فاي لغة برمجية كافية للقيام بذلك بكفاءة لكن الـ Java ستكون الخيار الأكثر ملائمة بالنسبة لبرامج التسيير اي برامج تسيير شركات و مدارس و مكتبات و غيرهم فمعظم اللغات كفيلة بصناعتها ، لكن لغات برمجية كـ Vb.net و Delphi و كدى الـ Windev تعد الأفضل في هذا المجال ، لتعاملها السلس مع قواعد البيانات بالنسبة لبرامج الحماية - التكسير و الضغط و التشفير و التعامل مع مكونات الحاسوب و غيرها من الوظائف الاحترافية جدا فان الخيار الأمثل سيكون لغة احترافية كالـ C او الـ ++C رغم ان هاتان اللتان يمكناك ايضا من صناعة برامج متنوعة مكتبية - للتسيير و تطبيقية بسيطة الا ان درجة صعوبتهما تجعل من صناعة برامج عادية مثل تلك البرامج امرا صعبا و عاديا في نفس الوقت ، فما الذي ساستفيده من تضييع الوقت و حرق خلايا العصبية في سبيل انشاء برنامج يمكنني انشائه بسهولة بلغة اخرى