9,515 research outputs found

    A cognitive study of learning to program in introductory programming courses.

    Get PDF
    Programming is notoriously hard for novices to learn and a substantial number of learners fail in introduction to programming courses. It is not just a UK problem: a number of multi-institutional and multi-national studies reveal that the problem is well-known and is widespread. There is no general agreement about the causes or the remedies. The major factors which can be hypothesised as a cause of this phenomenon are: learners' psychology; teaching methods; complexity of programming. In this study, learners' common mistakes, bugs, misconceptions, frequencies and type of errors (syntactic and semantic) in the early stages of learning programming were studied. Noticing the patterns of rationales behind novices' mistakes swayed the study toward investigating novices' mental ability which was found to have a great effect on their learning performance. It was observed that novices reported a recognisable set of models of program execution each of which was logically acceptable as a possible answer and it appeared that some students even used these models systematically. It was suspected that the intellectual strategies behind their reasoning could have been built up from their programming background knowledge and it was surprising when it was found that some of those novices had not even seen a program before. A diagnostic questionnaire was designed that apparently examined a student's understanding of assignments and sequence but in fact was capturing the reasoning strategy behind their interpretation of each question, regardless of a correct or wrong answer. The questionnaire was administered in the first week of an introductory programming course, without giving any explanation of what the questions were about. A full response from most participants was received, despite the fact that the questions were unexplained. Confronted with a simple program, about half of novices seem to spontaneously invent and consistently apply a mental model of program execution. They were called the consistent subgroup. The other half are either unable to build a model or to apply one consistently. They were called the inconsistent subgroup. The first group perform very much better in their end-of-course examination than the rest. Meta-analysis of the results of six experiments in UK and Australia confirmed a strong effect of consistency on success which is highly significant (p < 0:001). A strong eect persisted in every group of candidates, sliced by background factors of programming experience (with/ without), relevant programming experience(with/without), and prior programming course (with/without) which might be thought to have had an effect on success. This result confirms that consistency is not simply provided by prior programming background. Despite the tendency in institutions to rely on students' prior programming background as a positive predictor for success, this study revealed that prior programming education did not have a noticeable eect on novices' success. A weak positive eect of prior programming experience was observed overall which appeared to be driven by one experiment with a programming-skilful population. This study shows that students in the consistent subgroup have the ability to build a mental model, something that follows rules like a mechanical construct. It also seems that when programming skill is measured by a weak assessment mechanism, the eect of consistency on success is reduced

    Strategic programming on graph rewriting systems

    Full text link
    We describe a strategy language to control the application of graph rewriting rules, and show how this language can be used to write high-level declarative programs in several application areas. This language is part of a graph-based programming tool built within the port-graph transformation and visualisation environment PORGY.Comment: In Proceedings IWS 2010, arXiv:1012.533

    Evaluation of genetic improvement tools for improvement of non-functional properties of software

    Get PDF
    Genetic improvement (GI) improves both functional properties of software, such as bug repair, and non-functional properties, such as execution time, energy consumption, or source code size. There are studies summarising and comparing GI tools for improving functional properties of software; however there is no such study for improvement of its non-functional properties using GI. Therefore, this research aims to survey and report on the existing GI tools for improvement of non-functional properties of software. We conducted a literature review of available GI tools, and ran multiple experiments on the found open-source tools to examine their usability. We applied a cross-testing strategy to check whether the available tools can work on different programs. Overall, we found 63 GI papers that use a GI tool to improve nonfunctional properties of software, within which 31 are accompanied with open-source code. We were able to successfully run eight GI tools, and found that ultimately only two ---Gin and PyGGI--- can be readily applied to new general software

    Telecommand and Telemetry Implementation of Aalto-2 CubeSat Project

    Get PDF
    This thesis work concentrates on the development of telecommand and telemetry handler software for a 2 kg Aalto-2 nanosatellite, currently scheduled for launch in October 2016. The satellite is part of the international QB50 termosphere mission and it is developed by Aalto University in Espoo, Finland. The telecommand and telemetry (TC/TM) handler, in charge of communications, is one of the most important systems of satellite software, which is executed by On Board Computer (OBC). In this thesis, the TC/TM handler subsystem is designed, giving it a special attention in maintaining simplicity and reliability. The design process is started with the derivation of requirements and constraints. The software is implemented for FreeRTOS, an open-source real-time operating system, which is selected as operation environment of the satellite OBC software. The designed software uses a Concatenative Language approach and complies with ECSS-PUS standard. It features different libraries that provide capabilities for on-board data handling needs, the most notable of which is the Dyncall library. The library provides functions of dynamic function call in C. The UHF driver handles incoming and outgoing low-level communications protocols, and the Coffee File System implements storage management. The work gives an overview of small satellite communication architectures and relevant standards and interfaces.Esta tésis se centra en el desarrollo de sistemas de telecontrol y software controlador de telemetría para el nanosatélite Aalto-2, cuyo lanzamiento está previsto para octubre de 2016. El satélite forma parte de la misión internacional QB50 termosphere y ha sido desarrollado por la Universidad de Aalto en Espoo, Finlandia. El controlador de telecomando y telemetría (TC/TM), a cargo de las comunicaciones, es uno de los sistemas más importantes del software del satélite. Este software es ejecutado por el Ordenador de abordo (OBC). El proceso de diseño se inicia con la derivación de los requisitos y limitaciones. El software está implementado para FreeRTOS, un sistema operativo en tiempo real de código abierto, que es seleccionado como entorno operativo del software del OBC. El software diseñado utiliza un enfoque de programación concatenativa y cumple con la norma de ECSS-PUS. Cuenta con diferentes librerias que proporcionan capacidades de datos de abordo necesidades de manipulación, el más notable de los cuales es la libreria Dyncall. Esta proporciona funciones de llamada dinámica en C. Los drivers de la UHF maneja los protocolos de comunicación de bajo nivel de entrada y salida, y el sistema de archivo es implementado por el Coffe File System o CFS. El trabajo ofrece una visión general de las arquitecturas de comunicaciones de nanosatélites, las normas pertinentes y las interfaces.Aquesta tési es centra en el desenvolupament de sistemes de telecontrol i programari controlador de telemetria per al nanosatèl·lit Aalto-2, el llançament del qual està previst per octubre del 2016. El satèl·lit forma part de la missió internacional QB50 termosphere i ha estat desenvolupat per la Universitat d'Aalto a Espoo, Finlàndia. El controlador de telecomandament i telemetria (TC / TM), se'n fa càrrec de les comunicacions i és un dels sistemes més importants del programari del satèl·lit. Aquest és executat per l'ordinador d'abord (OBC). El procés de disseny s'inicia amb la derivació dels requisits i limitacions. El programari està implementat per FreeRTOS, un sistema operatiu en temps real de codi obert, que és seleccionat com a entorn operatiu del OBC. El programari dissenyat utilitza un enfocament de programació concatenada i compleix amb la norma de ECSS-PUS. Compta amb diferents llibreries que proporcionen capacitats de dades d'abordo necessitats de manipulació, el més notable dels quals és la llibreria Dyncall. Aquesta proporciona funcions de crida dinàmica en C. Els drivers de la UHF controla els protocols de comunicació a baix nivell d'entrada i sortida, i el sistema d'arxiu és implementat pel Coffe File System o CFS. El treball ofereix una visió general de les arquitectures de comunicacions de nanosatèl·lits, les normes pertinents i les interfícies

    A bounded-search iterated greedy algorithm for the distributed permutation flowshop scheduling problem

    Get PDF
    As the interest of practitioners and researchers in scheduling in a multi-factory environment is growing, there is an increasing need to provide efficient algorithms for this type of decision problems, characterised by simultaneously addressing the assignment of jobs to different factories/workshops and their subsequent scheduling. Here we address the so-called distributed permutation flowshop scheduling problem, in which a set of jobs has to be scheduled over a number of identical factories, each one with its machines arranged as a flowshop. Several heuristics have been designed for this problem, although there is no direct comparison among them. In this paper, we propose a new heuristic which exploits the specific structure of the problem. The computational experience carried out on a well-known testbed shows that the proposed heuristic outperforms existing state-of-the-art heuristics, being able to obtain better upper bounds for more than one quarter of the problems in the testbed.Ministerio de Ciencia e Innovación DPI2010-15573/DP

    A comparative study of software architectures in constrained-device iot deployments

    Get PDF
    Since its inception in 2009, the Internet of Things (IoT) has grown dramatically in both size and complexity. One of the areas that has seen significant developments is that of resourceconstrained devices. Such devices clearly require careful engineering in order to manage resources such as energy and memory, whilst still ensuring acceptable performance. A number of aspects play a critical role in the engineering of such systems. One such aspect is the choice of software architecture. The microservices architecture appears to be a promising approach for IoT, as suggested by a number of researchers. However, limited research has been done on the implementation of microservices in IoT and resource-constrained devices, and even less research has been done to compare the microservices architecture to the monolithic architecture in such deployments. The aim of this research thesis was to compare these two architectures in the context of IoT and constrained devices. The two architectures were compared by: energy consumption, runtime performance and memory consumption. To ensure that the results are not specific to a single programming language, each architecture was developed in three different languages: Go, Python and C++. Following a review of different asynchronous messaging protocols, Message Queuing Telemetry Transport was selected. The experiments were conducted on a Raspberry Pi 4, and a number of other hardware devices were used, including sensors, an actuator and a type C USB Tester. Two metrics were used to measure power consumption: maximum instantaneous power consumption and total power consumption. Whilst three metrics were used to measure memory consumption: maximum Resident Set Size (RSS), total RSS and central processing unit (CPU) resource usage. Each experiment was carried out 10 times in order to ensure data validity. The power consumption results showed that the microservices architecture had, on average, 14,9% higher maximum instantaneous power consumption, whilst the total power consumption of the microservices architecture was only 3,0% greater than that of the monolithic architecture. The runtime results indicated that the microservices architecture had a longer runtime than the monolithic architecture for Go and C++, whilst the inverse was true for Python. When considering memory consumption, it was found that the maximum RSS was 37,1% greater for the microservices architecture. The total RSS results for both architectures were very similar for Go and C++, whilst microservices performed much better for Python. Lastly, the results for CPU usage showed that the monolithic architecture had, on average, 14,9% greater CPU usage than the microservices architecture. It was concluded that, for small-scale applications, the monolithic architecture had better performance across most metrics and languages. It was, however,recommended that additional research be conducted on larger scale applications to determine the applicability of these results beyond the scope of small-scale applications. In general, there is still much room for research in this area.A Web e a Internet das Coisas (WoT/IoT) são áreas empolgantes que, sem dúvida, continuarão a desenvolver-se nos próximos anos. À medida que vão sendo feitos novos desenvolvimentos nestas áreas, e vários tipos de objetos se tornam “Coisas”, é expectável que a limitação de recursos seja cada vez mais uma preocupação. Atualmente já existem muitos dispositivos que possuem recursos limitados por vários motivos, como a sua localização em locais difíceis ou remotos (ex: sensores implantáveis ou sensores de erupção vulcânica) ou necessidade de trabalhar enquanto estão em movimento (ex: dispositivos vestíveis). Assim sendo, a necessidade de usar-se os recursos de forma eficiente será cada ver maior. O objetivo primordial desta tese foi o de analisar a utilização de recursos por parte de uma aplicação IoT, considerando duas arquiteturas de software diferentes, implementada num dispositivo com poucos recursos. O dispositivo escolhido é um Raspberry Pi 4, dado ser um dispositivo embarcado bastante adequado para realização de testes. As arquiteturas que foram comparadas neste estudo foram: microsserviços e monolítica. Para garantir que os resultados não fossem específicos da linguagem utilizada, o desenvolvimento foi feito em três linguagens de programação: Go, Python e C++. Embora seja possível encontrar estudos que analisam como as linguagens de programação utilizam os recursos, apenas foi encontrado um estudo cujo foco é a eficiência energética, memória e tempo de execução em dispositivos com recursos limitados, não tendo sido encontrado nenhum estudo que compare o desempenho das arquiteturas de software em dispositivos com recursos limitados. A adoção de uma arquitetura de microsserviços em ambientes WoT/IoT tem vantagens, como modularidade, flexibilidade e facilidade de manutenção. Vários estudos referem que esta arquitetura é adequada para WoT/IoT, pois compartilha muitos dos mesmos objetivos. WoT/IoT é inerentemente dinâmico e tem muitos pontos de extremidade, o que pode apresentar desafios de desenho e implementação. Uma arquitetura como microsserviços pode explorar estas caracteristicas, transformando estes desafios em vantagens. No entanto, não foi encontrada investigação que compare o desempenho da arquitetura de microsserviços com a arquitetura monolítica, especialmente no contexto IoT, tendo sido este o foco desta tese. A escolha do protocolo de transferência de mensagens, para comunicação entre os vários microsserviços, foi também analisada. Um protocolo de transferência leve será o mais adequado, para dispositivos que têm recursos limitados, e três opções foram consideradas em mais profundidade: MQTT (Message Queuing Telemetry Transport), AMQP (Advanced Message Queuing Protocol) e CoAP (Constrained Application Protocol). Da análise feita, verificou-se que o MQTT é limitado na qualidade de serviço, seguranca e confiabilidade que oferece, isto quando comparado com o AMQP, sendo por isso um protocolo mais leve. Ao comparar-se MQTT e CoAP, verificou-se que ambos os protocolos oferecem vários benefícios, tendo o MQTT sido escolhido para os testes realizados. A abordagem técnica que foi adotada é descrita em detalhe, incluindo os componentes de hardware necessários para o projeto e o software necessário para a recolha de medições. Foi ainda delineada uma metodologia experimental, a qual foi seguida de perto. Foram obtidos resultados que permitem analisar em detalhe o consumo de energia, o tempo de execução e o consumo de memória. Quanto ao consumo de energia, em específico, recolhe-se o consumo de energia instantâneo máximo e o consumo de energia total. Desta análise verificou-se que o consumo de energia instantâneo máximo da arquitetura de microserviços foi, em média, e em todas as linguagens, 14.9% maior do que o consumo obtido para a arquitetura monolítica. Verificou-se também que a linguagem Go tem o maior consumo de energia instantâneo máximo, para ambas as arquiteturas, enquanto que o Python e o C++ tiveram medidas semelhantes. Os resultados para o consumo total de energia (durante o tempo de execução total) foram ligeiramente diferentes. Ao comparar-se as duas arquiteturas, deduziu-se que os valores de consumo de energia eram muito semelhantes e, em média, e em todas as linguagens, a arquitetura de microsserviços consumia apenas 3.0% a mais que a arquitetura monolítica. Também foi verificado que ao usar-se a arquitetura monolítica, o consumo total de energia era quase idêntico em todos as linguagens. Com a arquitetura de microserviços, o Python teve o maior consumo, seguido do Go e C++, embora os valores não tenham diferido muito. Também ficou claro que, embora o consumo de energia instantâneo máximo possa ser útil para entender os requisitos de energia de pico, não é diretamente proporcional ao consumo de energia total. Por exemplo, o Python teve o menor consumo de energia instantâneo máximo, mas o maior consumo de energia total. A segunda parte dos resultados considerou o desempenho no que diz respeito ao tempo de execução. Considerando apenas a arquitetura, verificou-se que a quitetura de microsserviços tinha um tempo de execução maior do que a arquitetura monolítica para Go e C++, enquanto o inverso era verdadeiro para o Python, o que pode estar relacionado com a otimizacao de simultaneidade vinculada à unidade central de processamento (CPU), pelas diferentes linguagens. Ao comparar o tempo de execução das linguagens de programacao, os resultados ficaram amplamente em linha com as expetativas. C++ teve o menor tempo de execução, seguido de perto pelo Go. O Python teve um tempo de execução significativamente mais longo, o que faz sentido já que o Python é a única linguagem interpretada que foi usada neste projeto. Foi interessante notar que o tempo de execução do Python foi muito maior ao usar-se uma arquitetura monolítica do que ao usar-se uma arquitetura de microserviços, o que não foi o caso do C++ ou Go. Com a arquitetura de microserviços, o Python teve um tempo de execução médio 319.4% maior do que o do C++, enquanto que o tempo de execuçao médio do Go foi 31.5% maior do que o do C++. Diferenças semelhantes foram observadas para a arquitetura monolítica. O consumo de memória foi medido usando três métricas diferentes: tamanho do conjunto residente (RSS) máximo, RSS total e uso de CPU. A comparação do RSS máximo, em cada arquitetura, mostrou que o RSS máximo para a arquitetura de microserviços foi 37.1% maior do que para a arquitetura monolítica. A diferença foi especialmente significativa para Python (65.9% de diferença). Verificou-se que o Go teve um RSS máximo significativamente maior do que as outras linguagens, para ambas as arquiteturas. O Python teve o menor RSS máximo na arquitetura monolítica, enquanto que o C++ teve o menor para a arquitetura de microserviços. Os resultados para o RSS total foram muito diferentes do RSS máximo, tanto por arquitetura como por linguagem usada. Mais concretamente, as medidas totais de RSS para Go e C++ nao diferiam muito por arquitetura, embora houvesse uma grande diferença quando comparado com o Python. Em média o RSS total foi 127.0% maior para a arquitetura monolítica do que para a arquitetura de microserviços, ao usar-se Python. Comparando por linguagem, o RSS total do Python foi significativamente maior do que para as outras duas linguagens, especialmente para a arquitetura monolítica, enquanto o Go e C++ tiveram medições RSS totais muito semelhantes. A última métrica de consumo de memória considerada foi o uso médio da CPU. Verificou-se que a arquitetura monolítica teve, em média, 14.9% maior utilização de CPU do que a arquitetura de microserviços, e a maior diferença foi observada para o Python. Uma comparação por linguagem mostrou que o Go teve a maior utilização de CPU, para ambas as arquiteturas. O C++ teve a segunda maior utilização de CPU, e o Python teve a menor utilização. Estas conclusões foram de encontro às expectativas, já que o Go tem processos integrados leves (rotinas Go), podendo otimizar a utilização de CPU. Esta dissertação produziu, em geral, resultados muito interessantes, uns mais esperados que outros. Os resultados mostraram que a arquitetura monolítica teve melhor desempenho na maioria das métricas, ou seja, consumo de energia instantâneo máximo, consumo de energia total (apenas para o Go e Python), tempo de execução geral (apenas para o Go e C++), RSS e CPU máximos. Deste modo, é possível concluir que ao implementar-se aplicações de pequena escala, em dispositivos IoT, a arquitetura monolítica pode oferecer mais benefícios. É bastante provável, no entanto, que a arquitetura de microserviços possa superar a arquitetura monolítica em aplicações de maior escala. A dimensão da aplicação deve, por isso, ser considerada ao escolherse uma arquitetura de software. Claramente, ainda existe muito espaço para contribuição nesta área de investigação. A investigação encontrada sobre o desempenho da arquitetura de microserviços, em comparação com a arquitetura monolítica, é limitafa e não foi encontrada investigação no contexto da IoT. Isto acaba por ser surpreendente, pois muitas empresas estão já a adotar microserviços e tem havido um aumento das pesquisas relacionadas com esta arquitetura. Assim sendo, compreender quais as vantagens e desvantagens desta arquitetura tornou-se muito pertinente. Embora esta dissertação tenha analisado a arquitetura de microsserviços, e tendo esta sido comparada com a arquitetura monolítica, considerando diferentes linguagens, a análise é feita numa escala relativamente pequena, quanto ao número de componentes de serviço, e num único dispositivo embarcado. A análise de aplicações de maior escala forneceria, certamente, perceções adicionais muito valiosas
    corecore