C in CS1: Snags and Viable Solution

Programming is one of the career rewarding skills; however, learning programming skill is extremely hard and arduous as supported by several studies. The first programming language has an everlasting impact on the programmer’s program’s development abilities. In most of the universities the imperative paradigm is used for introductory programming courses and generally C language is used as a base language of a first programming course. The C language is a leading programming language and extensively utilized for commercial applications. The majority of the programming languages are highly motivated from the C language, yet its intrinsic complexities and non-pedagogic origin evidently makes it hard and a complex choice for a first programming course. This paper proposed a rational and realizable solution that can make a C language a suitable choice for a first the course of programming.


INTRODUCTION
P rogramming skill is an essential element of computer science courses and one of many skills that students of computer science programs are presumed to master [1]. One of the most difficult aspects of computer science curriculums involves facilitating students in comprehending the concepts of computer programming. Almost in all computer science academic programs, it is required to take an introductory programming course. Programming is an important skill and a rewarding career. It is usually recognized that it takes around ten years of experience to be an professional programmer [2]. However, learning to program is a difficult task for beginners [3,4]. Hagan and Markham claim that for all computing courses the programming is the least interesting and most difficult subject by most first year students [5]. Programming is inherently complex and beginning students naturally lack the knowledge and

C in CS1: Snags and Viable Solution
The first programming language of student has a strong effect on program development capabilities as significant as the impact of our native language on our thought [9]; in fact the first programming language will set the tone for all subsequent classes [10].
Selection of an appropriate programming language for the first course on programming is an important issue [11,12].
There have been very substantial studies and discussion on selection of programming language for introductory courses of programming [13][14][15][16]. However, the introductory programming courses are widely recognized to pose challenges and problems for both students and instructors and high dropout rates of 20-60% are reported in different academic institutions [17][18][19][20]. Despite of an extensive study in introductory programming, the pass rates were not observed to have considerably differed over time [21].
The appropriate paradigm and language chosen for the introductory programming course may overcome the intrinsic complexity of introductory programming. There are around 2000 to 3000 famous programming languages documented on the Web [22], consequently it is intricate to select any programming language for the first programming course. Over the years there has been a substantial debate and study about which language is appropriate for the introductory programming course; hitherto there is no final consensus on any programming language. Such as in [23], it is argued that Java is better than C++, and C++ is not a good choice for introductory programming. Similarly, Wallace and Martin considered that Java is better that other programming language [24].
However, Biddle and Tempero [25]  In 2013, the same pattern of study is conducted and surveyed the 38 introductory programming courses in New Zealand and Australian universities [28]. According to that study the imperative (procedural) paradigm is the preferred paradigm used for teaching as shown in Fig. 1.
The study also reported that Python, Java, JavaScript, C,  The response about the recommended paradigms clearly indicates that imperative paradigm is one of a most advocated method in Pakistan. The instructors were also asked to recommend the appropriate programming language for the first imperative programming course.

C in CS1: Snags and Viable Solution
The response of recommended programming languages indicates that for majority of instructors in Pakistan, the C language is still a favorite choice for the first programming course.
The C is widely recognized language, yet there have been a wide debate about its educational appropriateness and usefulness.
The pedagogical application of a C language is explicitly opposed in that been designed especially for educational purposes [32]. This paper introduced a plain technique that can make C language a suitable option for the CS1 in controlling its inherent complexity and intricacies.
The rest of the paper is structured as follows. The major intricacies and difficulties association with the application of the C language in introductory courses of programming are described in the second section, while the prior work is briefly illustrated in a third section. The proposed solution is introduced in a fourth section. The initial results obtained after the primary assessment of the proposed techniques are described in the fifth section and the last section includes the conclusion.

CRITICISM AND PEDAGOGICAL ISSUES
The C language has wide applications in commercial and scientific areas. However, it is explicitly criticized and opposed to education in the introductory courses of programming. Following is the brief element of main appraisal and educational concerns of the C language.
(1) The C is not outsized, yet too complex for novice students [33], and it is unfeasible to introduce entire C language in the CS1.
(2) It is openly described that C language was designed by Dennis Ritchie, who was not noneducationist but a mathematician and physicist.
So rarely considered the educational aspects during the development of a C language, and ultimately it is unenviable to exercise C language for introductory courses of programming.
(3) C is not a natural language and its syntax and facets like program organization, arrays and control structures are difficult for novice students [34]. In [35], Petrov claims that unexpected and unfamiliar syntax of C language creates the confusion and raise the psychological tension.
(4) The unsigned data types in C are virtually useless, in that it is safe and simple to use the signed data. Similarly the formatting symbol "%" is difficult to rationalize. The abbreviation of several arithmetic operations seems useless and overwhelming.
The equality statement is extremely difficult and mostly muddled with assignment statement and consequently causes strenuous errors.
The grammar of C language controverts to the human language and grammar [35], and C itself does not follow the conventional mathematical notation.
The subscripting of arrays in C language starts from zero, and it also does not support bound checking, for that reasons novice students face severe problems in the learning and implementing arrays based programs.
The majority of the statements of C language is permitted to be defined on a single line, while numerous statements entails a unique line. For novice students of CS1, it is mostly very complex to comprehend and implement these dissimilarities. The case sensitivity of a C language is another major issue that makes the language more difficult for beginners.
The Boolean-data type is not available in C language and educationally it is a main problem [36], and the corresponding code for the realization of Boolean-data type is usually very odd and complex in the framework of learning and generally an error prone.
The pointer is an essential constituent of a C program, but it is extremely complex for beginners, especially the arithmetic of C language is exceptionally complex to comprehend. Egan and McDonald claim that pointers and manual memory management can be difficult to comprehend [37]. The pointers are not only difficult for beginners, but also hard for experienced programmers [35].  [38]. (15) The union is one of a useful feature of the C language; though, it is abnormally strenuous to understand and implement.
The shift-wise operators and bit-manipulation operators are very difficult to learn and implement.
The very strange notion of logical operators is used in C language. The exclamation mark "!" is used as an operator in the C language, whereas it is customarily used for different purpose, and these differences make it confusing for beginners.
In [39], it is described that the C language is an industry standard and for that reason it should not utilized as an introductory language because the beginners will become biased for future programming languages. It is also described that C is a magnificent programming language for terrorists as it is excellent for negative programming.

SIGNIFICANT SOLUTIONS
Several solutions have been developed to define the C language viable for introductory courses in programming.
In [34], the notion of using HTML, EXCEL and MATLAB before introducing the C language is proposed. These applications help the novice beginners in learning the difficult features of a C language. For instance, the HTML can be helpful in comprehending the layout of the program; EXCEL may be fruitful in learning the input/output and arrays. Likewise, MATLAB can be productive in introducing the condition and repetition control structures. [37] introduced the notion of natural language description of program behavior and program visualization to help the beginners in increasing their knowledge, understanding and aid in program debugging.

Egan and McDonald
A system based on that proposed method is formalized and used for C. Similarly, in [40], the use of Robotic Invention System 2.0 for introducing the C language is introduced.
In [36], it is argued that there are some troubles in employing the C language at the initial level; nonetheless it is possible to lessen the difficulties by utilizing the benefits of conventional software engineering techniques.

METHOD AND DISCUSSION
The C is a very prevailing language, but it is difficult to conventionally teach C language to novice students than it is to introduce the pure educational programming language, but the indelible paybacks are more important and necessary than momentary outlays. Practically, it is possible to diminish the complexities associated with using the C language in introductory courses of programming by utilizing the proposed method. The proposed technique is based on 4 pillars.

Prior Knowledge
The lack of prior knowledge of programming is a major cause for the intricacy of C language. The novices without prior experience of programming suffer severe problems in learning process [41,42]. However, the beginners with prior acquaintance of programming work better, particularly in the CS1 [43,44]. It is widely believed that the C language is extremely logical and this perception demotivated the novice students.
The first principle of the proposed technqiue is to introduce a foundation course before introducing the actual C language. This foundation course can provide the basic knowledge of algorithmic thinking, problem solving and essential of elementary programming.
Fortunately, several preprogramming tools are available.
GRAIL is preprogramming language designed to offer before the first course of programming and helps the beginners to understand the programming concepts [45].
GRAIL is a small programming language designed to support the imperative programming concepts. A preliminary course has designed by using Alice [48] to prepare the students for comprehending the concepts of programming and preparing them for a first programming course [50,51]. The results indicate the aptness of Alice in improving the performance of students and similarly the same leverage can be obtained by introducing Alice before the C language.
In [52], CS 0.5 course is introduced to before the first programming course. The intention of CS 0.5 is to give beginners a programming maturity before diving into CS1.
The gentle revised version of Guzdial's media computation [53] is used in CS 0.5.
Sometimes it is undesirable to initiate a foundation language before starting the C language; in that situation, it is possible to introduce the educational dialects of C language (like Educational C [33]), and the dedicated programming environment (like Thetis [54]) before starting the C language.
Apart from the other tools there are myriad many tools like RAPTOR and FLOWGORITHM that can be used to introduce the fundamental of elementary programming before the C language.

Use of Doodles
Several elements of the C language like input/output, arrays, pointers, functions and types of arguments are obviously difficult for novice students, and the key reasons from their intricacy are the complexity of topics and the unusual syntax of the C language. The novice students are generally forced to learn these notions and the strange syntax of the language at the same time. The unknown and mysterious taxonomies and complex syntax of C makes the control structures, arrays, pointers and functions more difficult for beginners; however the reasonable exercise of doodles can conquer these problems.
Utmost employment of doodles in introducing and learning the C language is the second principle of the proposed technique. Doodle is any kind of an illustration or diagram drawn to comprehend the purpose of the programs [55]. Doodle is exceptionally helpful in the preliminary stages of programming [56]. With the different types of doodles [55], it is significantly straightforward to comprehend the hard concepts without considering the complicated syntax of the C language. Through pictorial illustrations and doodles it is quite simple to learn these fundamental concepts.

Less is More
Nearly all the contemporary programming languages, including the C is radically very large, and sensibly it is unreasonable and unfair to teach entire C language in the CS1, but only the necessary topics are advantageous in the CS1, where complex topics like union, bitwiseoperators, shift-wise operators and conditional compilation can be offered in the later programming courses or may be introduced in the later stages of the CS1 and this is the fundamental idea of the third principle of the proposed technique.

Pair Programming
The C language is completely diverse from programming languages and therefore requires a radically special approach. Similarly, the time, efforts, adroitness and deliberation need to learn the C language is appreciably more than the other programming languages.
It is widely accepted that the pair programming can overcome the several pedagogical problems. Pair programming is a pivotal practice of Extreme Programming and a way in which two developers work together at one system on the same problem [57]. The programmer writing the program is called the driver and the other teammate is called navigator. Pair programming has been largely applied in education because of the leverage it brings to students. The pair programming has been fruitful in introductory programming courses.
In order to strengthen our thesis the instructors were asked to indicate whether the pair programming can surmount the several problems associated with the use of the C language in a first programming course. Fig. 4 indicates the response of instructors.
Most of the instructors recognized that the effective teaching methodology can be a useful panacea for the several pedagogical issues of C languages. At last, it is worth here to state that in the teaching of C language programming, design, some problems exists on both sides, students and instructors [58]. So the instructors should revolutionize their teaching philosophy and students should instinctively learn and ameliorate their learning motivation.

PRELIMINARY TEST AND RESULTS
In order to ascertain whether the proposed method is really effective in making the C language a viable choice for the CS1, a small study is conducted. As a part of the study, 82 students of the undergraduate computer science program are selected and randomly divided in two groups (called control group and treatment group). The C based first programming course is offered by the same instructor to the both groups, and the conventional teaching approach is followed for the control group, whereas the proposed method is followed for the treatment group. For the realization of a first principle of the proposed method, we have used the RAPTOR environment to introduce the algorithmic and preprogramming knowledge to the treatment group. The flowchart-based notation has been extensively used in the context of introducing novices to programming [59]. RAPTOR is a programming environment, developed exclusively to aid novice students in comprehending the programming and the algorithms.
RAPTOR is successfully used to introduce programming to novice students with flowcharts [60][61][62]. Fig. 5 shows the environment of RAPTOR.
The preprogramming environment/language is virtually introduced to increase the motivation level by providing the prior knowledge before starting the actual massive course.
Throughout the duration of course, the students of treatment group are softly encouraged and motivated to doodle the programs. The instructor itself doodles the major programs and concepts introduced during the course. With the extensive use of doodles it is clearly realized that several logical concepts of the C language are extremely easy to comprehend and implement. Fig. 6 shows the sample doodle for the arrays.
Several concepts of C language like functions, types of arguments and pointers are intrinsically hard to teach and comprehend, whereas the feedback received from the instructor illustrate that the use of doodle surprisingly reduced their complexities. As an illustration, consider the Fig. 7 for the sample doodle of user defined function. The curriculum of the C based first programming course for the both groups was same and included the elementary topics, but also included some complex topics like the bitwise operators, union and conditional compilation. As the realization of the third principle of the proposed method, these complex topics are introduced in the later lectures, and introduce with the extensive use of doodles. For treatment group the instructor principally follows the imperative-first approach, but also consider the conceptfirst approach.
After the completion of course, both groups are evaluated with pen and paper exam. Fig. 8 shows the results. The box plot of the marks obtained by the students of the treatment group is shown in Fig. 10.
The results obtained from the initial assessment of the Independent sample t-test with a t-value = 2.38 and pvalue < 0.01 signified that students of treatment group did significantly better in C based first programming course than the students of the control group in the same C based first programming course. The grade wise distribution of marks of students of both groups is shown in Fig. 11.
From current results and analysis, it can be inferred that the proposed method can also improve the motivation level and may be useful in improving retention rate and controlling the dropout rates. In order to obtain, the significance of the proposed method in increasing the retention rate, students from both groups were interviewed and asked "whether they are willing to study another programming course in the next semester". The feedback received from the students is shown in Fig. 12.
The feedback received from the students indicated that students in the treatment group are highly motivated and their retention rate is much higher the students of the control group.
At last is important to realize that the pedagogical success of any programming language and improvement of retention pivot on several factors, albeit the feedback received from the both groups clearly indicates that the proposed method may be fruitful in reducing the inherent complexities of C language.

CONCLUSION
The C language is of a widely used programming language; however, its non-educational source makes it disputed and problematic for the CS1. In this paper a simple method is proposed that can make the C language a realizable choice for the CS1 by reducing it intrinsic complexities.
The proposed method is based on four main principles which are simple, feasible and applicable. We have applied the proposed method on a small group of students and statistical results and knowledge of using the proposed technique suggest that it can be useful in controlling the intrinsic intricacies of C language and can ultimately make the C language a viable choice for the CS1.